socket编程---SCTP
sctp_sndrcvinfo结构体

sctp_event_subscribe结构体

更多的关于SCTP的结构体http://aisxyz.iteye.com/blog/2408978
SCTP套接字编程相关函数

client.c
/*************************************************************************
> File Name: client.c
> Author: Chen
> Mail: 971859774@qq.com
> Created Time: 2018年11月14日 星期三 17时06分56秒
************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/sctp.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include "my_err.h" #define SERV_PORT 9877
#define SCTP_MAXLINE 800
#define SERV_MAX_SCTP_STRM 10 void sctp_cli(int sockfd,struct sockaddr * to,socklen_t tolen)
{
struct sctp_sndrcvinfo sri;
bzero(&sri,sizeof(sri)); char rdbuf[MAXLINE],rvbuf[MAXLINE];
struct sockaddr_in peeraddr;
int flag;
while(fgets(rdbuf,MAXLINE,stdin)!=NULL)
{
if(rdbuf[]!='[')
{
fprintf(stderr,"Error,line must be of the form '[strnum]text'\n");
continue;
} if(isdigit(rdbuf[]))
{
sri.sinfo_stream=strtol(&rdbuf[],NULL,);
int out_sz=strlen(rdbuf);
sctp_sendmsg(sockfd,rdbuf,out_sz,to,tolen,,,sri.sinfo_stream,,);
socklen_t len=sizeof(peeraddr);
int rd_sz=sctp_recvmsg(sockfd,rvbuf,sizeof(rvbuf),(struct sockaddr *)&peeraddr,&len,&sri,&flag); printf("From str:%d seq:%d (assoc:0x%x):",sri.sinfo_stream,sri.sinfo_ssn,(u_int)sri.sinfo_assoc_id);
printf("%.*s",rd_sz,rvbuf);
}
}
return;
} //是否有头端阻塞
void sctp_cli_all(int sockfd,struct sockaddr *to,socklen_t tolen)
{
struct sctp_sndrcvinfo sri;
bzero(&sri,sizeof(sri)); char rdbuf[MAXLINE],rvbuf[MAXLINE];
bzero(&rdbuf,sizeof(rdbuf));
bzero(&rvbuf,sizeof(rvbuf)); while(fgets(rdbuf,SCTP_MAXLINE-,stdin)!=NULL)
{
int rd_sz=strlen(rdbuf);
if(rdbuf[rd_sz-]=='\n')
{
rdbuf[rd_sz-]='\0';
--rd_sz;
} int i=;
for(;i<SERV_MAX_SCTP_STRM;++i)
{
snprintf(rdbuf+rd_sz,sizeof(rdbuf)-rd_sz,".msg.%d",i);
sctp_sendmsg(sockfd,rdbuf,sizeof(rdbuf),to,tolen,,,i,,);
} struct sockaddr_in peeraddr;
int flag;
for(i=;i<SERV_MAX_SCTP_STRM;++i)
{
socklen_t len=sizeof(peeraddr);
rd_sz=sctp_recvmsg(sockfd,rvbuf,sizeof(rdbuf),(struct sockaddr *)&peeraddr,&len,&sri,&flag); printf("From str:%d seq:%d (assoc:0x%x):",sri.sinfo_stream,sri.sinfo_ssn,(u_int)sri.sinfo_assoc_id);
printf("%.*s\n",rd_sz,rvbuf);
}
}
return;
} int main(int argc,char **argv)
{
int flag=;
if(argc<)
err_quit("please input server ip");
else if(argc>)
flag=;
//sock
int sockfd=socket(AF_INET,SOCK_SEQPACKET,IPPROTO_SCTP); struct sockaddr_in servaddr;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
inet_pton(AF_INET,argv[],&servaddr.sin_addr); struct sctp_event_subscribe events;
bzero(&events,sizeof(events));
events.sctp_data_io_event=;
setsockopt(sockfd,IPPROTO_SCTP,SCTP_EVENTS,&events,sizeof(events)); if(flag==)
sctp_cli(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
else
sctp_cli_all(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); /*
* ABORT类似于tcp的rst分节,无延迟的终止任何关联,尚未发送的任何数据都
* 丢弃,也没有TCP的TIME_WAIT的不良影响,
*/
/*
char beymsg[20];
strcpy(beymsg,"goodbey");
sctp_sendmsg(sockfd,beymsg,strlen(beymsg),(struct sockaddr *)&servaddr,sizeof(servaddr),0,MSG_ABORT,0,0,0);*/
close(sockfd);
return ;
}
server.c
/*************************************************************************
> File Name: client.c
> Author: Chen
> Mail: 971859774@qq.com
> Created Time: 2018年11月14日 星期三 14时56分38秒
************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <strings.h>
#include <netinet/sctp.h>
#include "my_err.h" #define SERV_PORT 9877
#define LISTENQ 1024 sctp_assoc_t sctp_get_no_strms(int sock_fd,struct sockaddr *to,socklen_t tolen,struct sctp_sndrcvinfo sri)
{
int retsz;
struct sctp_status status;
retsz=sizeof(status);
bzero(&status,sizeof(status)); status.sstat_assoc_id=sri.sinfo_assoc_id;
getsockopt(sock_fd,IPPROTO_SCTP,SCTP_STATUS,&status,&retsz);
return status.sstat_outstrms;
} int main(int argc,char **argv)
{
//socket
int sockfd=socket(AF_INET,SOCK_SEQPACKET,IPPROTO_SCTP); struct sockaddr_in servaddr,cliaddr;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY); //bind
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); struct sctp_event_subscribe events;
bzero(&events,sizeof(events));
events.sctp_data_io_event=;//预定,每次recvmsg返回sctp_sndrcvifo
setsockopt(sockfd,IPPROTO_SCTP,SCTP_EVENTS,&events,sizeof(events)); //listen
listen(sockfd,LISTENQ); char rdbuf[MAXLINE];
struct sctp_sndrcvinfo sri;
int flag,index=;
while()
{
socklen_t len=sizeof(struct sockaddr_in);
size_t rd_sz=sctp_recvmsg(sockfd,rdbuf,sizeof(rdbuf),(struct sockaddr *)&cliaddr,&len,&sri,&flag); if(index)
{
++sri.sinfo_stream;
if(sri.sinfo_stream>=
sctp_get_no_strms(sockfd,(struct sockaddr *)&cliaddr,len,sri))//如果流号增长到大于等于最大流号,重新置为0
sri.sinfo_stream=;
}
/*
* 服务器在发送完消息后终止关联,设置MSG_EOF标志。该标志迫使发送消
* 被客户确认后,相应的关联终止
*/
sctp_sendmsg(sockfd,rdbuf,rd_sz,(struct sockaddr *)&cliaddr,len,sri.sinfo_ppid,(sri.sinfo_flags),sri.sinfo_stream,,);
}
return ; }
socket编程---SCTP的更多相关文章
- socket编程:客户端与服务器间的连接以及各函数的用法
在认真的看UNP之前,一直被socket编程说的云里雾里,今天我要让大家从整天上认识socket编程,让我们知道socket编程的整个流程和各个函数的用法.这样:我们在写一些简单的socket编程时就 ...
- 2018.12.02 Socket编程之初识Socket
Socket编程主要分为TCP/UDP/SCTP三种,每一种都有各自的优点,所以会根据实际情况决定选用何种Socket,今天开始我将会逐步学习Socket编程,并将学习过程记录于此. 今天学习的是TC ...
- socket编程:recvmsg 和 sendmsg 函数
背景 复习 socket 编程的时候发现了以前没有留意到的 2个函数:recvmsg 和 sendmsg ref : Linux编程之recvmsg和sendmsg函数 知识 先来看看函数原型: #i ...
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- java socket编程(li)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
随机推荐
- 20145328 《网络对抗技术》逆向及Bof基础实践
20145328 <网络对抗技术>逆向及Bof基础实践 实践内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...
- 20145325张梓靖 《Java程序设计》第4周学习总结
20145325张梓靖 <Java程序设计>第4周学习总结 教材学习内容总结 何谓继承 继承共同行为 继承基本上就是避免多个类间重复定义共同行为:可把相同的程序代码提升为父类:用关键字 e ...
- 线程访问ui,使用委托方式
转:https://www.cnblogs.com/muyoucai/p/6257213.html Control类提供了一个Invoke方法来给子线程访问主线程的控件,它的原型是酱紫的: objec ...
- 【MVC - 参数原理】详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/spring ...
- centos7 Java开发环境构建
原帖 https://www.cnblogs.com/youcong/p/9118753.html Java开发基本环境 1.jdk的安装 https://www.cnblogs.com/zenghu ...
- BZOJ 3930 【CQOI2015】 选数
题目链接:选数 这种SB题我都Wa飞了,彻底没救系列- 首先,我们可以发现1,如果我们选了两个不同的数,那么它们的\(\gcd\)不会超过\(r-l+1\).于是,我们可以设一个\(f_i\)表示任取 ...
- Android res目录结构
所有以drawable开头的文件夹都是用来放图片的 所有以values开头的文件夹都是用来放字符串的 layout 文件夹是用来放布局文件的 menu 文件夹是用来放菜单文件的.之所以有这么多 dra ...
- SpringBoot创建多模块方式以及打包方式
springboot重构多模块的步骤 模型层:model 持久层:persistence 表示层:web 步骤: 正常创建一个springboot项目 修改创建项目的pom文件,将jar修改为pom ...
- MQ是什么 RabbitMQ
一.rabbitMQ是什么: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. 学过websocket的来理解rabbitMQ应该是 ...
- JSP 语法
JSP 语法 本小节将会简单地介绍一下JSP开发中的基础语法. 脚本程序 脚本程序可以包含任意量的Java语句.变量.方法或表达式,只要它们在脚本语言中是有效的. 脚本程序的语法格式: <% 代 ...