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 ...
随机推荐
- react 修改循环列表的当前单个子项状态:思路 拿原始state数据更改,再做请求
handleLike(item,index){ var id = item.id; _ENV.post( _ENV.HOST+'/communion/video-up', {'user_id':loc ...
- stm32_CAN总线知识(转)
源: stm32_CAN总线知识
- Core Java 5
p273~p276: 1.获取异常的更多信息:e.getMessage(). 2.得到异常的实际类型:e.getClass().getName(). 3.当异常之间不存在子类关系,并且异常的处理机制( ...
- Python3基础 print(,end=) 输出内容的末尾加入空格
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- openwrt下使用wget出现Failed to allocate uclient context
一.场景重现 root@OpenWrt:/# wget www.baidu.com Downloading 'www.baidu.com' Failed to allocate uclient con ...
- RabbitMQ 一个demo
Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...
- POJ 1170 Shopping Offers(完全背包+哈希)
http://poj.org/problem?id=1170 题意:有n种花的数量和价格,以及m种套餐买法(套餐会便宜些),问最少要花多少钱. 思路:题目是完全背包,但这道题目不好处理的是套餐的状态, ...
- Mac 下安装Java
下载:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 打开下载的文件,出现如下 ...
- git branch 误删 分支 找回
今天在写东西的时候,把自己的dev分支给删掉了.并且手贱的是吧远程分支也删掉了. 但是好在我强大的git!!!,把他找回来是分分钟的事情. 一.查看一下提交记录 git log -g 会有一个列表.如 ...
- JavaScript权威指南--WEB浏览器中的javascript
知识要点 1.客户端javascript window对象是所有客户端javascript特性和API的主要接入点.它表示web浏览器的一个窗口或窗体,并且可以用window表示来引用它.window ...