博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SCTP 学习
阅读量:4710 次
发布时间:2019-06-10

本文共 6397 字,大约阅读时间需要 21 分钟。

ubuntu 下安装 libsctp, lksctp(不行的话在redHat下试验)

apt-get install libsctp lksctp

服务端程序

1: #include 
2: #include 
3: #include 
4: #include 
5: #include 
6: #include 
7: #include 
8:
9: const int buf_size = 1024;
10: const int echo_port = 2013;
11:
12: char* usage_msg="usage: sctp_echo [ip_addr]+ istreams ostreams";
13: void usage()
14: {
15:     fprintf(stderr,"%s\n",usage_msg);
16:     exit(1);
17: }
18:
19: int main(int argc, char** argv)
20: {
21:
22:     char buf[buf_size];
23:     time_t time;
24:
25:     int sockfd, client_sockfd,flags;
26:     int nread,len;
27:     struct sockaddr_in serv_addr, client_addr;
28:     struct sctp_initmsg initmsg;
29:     struct sctp_status status;
30:     sctp_assoc_t associd;
31:     struct sctp_sndrcvinfo sinfo;
32:     struct sctp_event_subscribe events;
33:
34:     struct sockaddr_in *addrs;
35:     int addr_size = sizeof(struct sockaddr_in);
36:     int addr_count = 1;
37:     int num = 0;
38:
39:     if(argc < 4) usage();
40:
41:     sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
42:     if(sockfd < 0)
43:     {
44:         fprintf(stderr,"socket descriptor is invalid.");
45:         exit(1);
46:     }
47:
48:     serv_addr.sin_family = AF_INET;
49:     serv_addr.sin_addr.s_addr = INADDR_ANY;
50:     serv_addr.sin_port = htons(echo_port);
51:
52:     int brst = sctp_bindx(sockfd,(struct sockaddr*)&serv_addr,
53:                 addr_count,SCTP_BINDX_ADD_ADDR);
54:     if(brst == -1)
55:     {
56:         fprintf(stderr,"error while binding address.");
57:         exit(1);
58:     }
59:
60:     memset(&initmsg,0,sizeof(initmsg));
61:     initmsg.sinit_max_instreams = atoi(argv[2]);
62:     initmsg.sinit_num_ostreams = atoi(argv[3]);
63:     fprintf(stdout,"asking for input streams:%d, output streams %d\n",
64:             initmsg.sinit_max_instreams, initmsg.sinit_num_ostreams);
65:
66:     brst = setsockopt(sockfd,IPPROTO_SCTP,SCTP_INITMSG,
67:             &initmsg,sizeof(initmsg));
68:     if(brst != 0)
69:     {
70:         fprintf(stderr,"error while setting sctp options.\n");
71:         exit(1);
72:     }
73:
74:     listen(sockfd,5);
75:
76:     for(;;)
77:     {
78:         len = sizeof(client_addr);
79:         client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &len);
80:         if(client_sockfd == -1)
81:         {
82:             fprintf(stderr,"error while accepting connection, continue.\n");
83:             continue;
84:         }
85:
86:         memset(&status,0,sizeof(status));
87:         len = sizeof(status);
88:         status.sstat_assoc_id = 0;
89:
90:         brst = getsockopt(client_sockfd,IPPROTO_SCTP,SCTP_STATUS,&status,&len);
91:         if(brst == -1)
92:         {
93:             fprintf(stderr,"error while getting socket option.\n");
94:         }
95:
96:         fprintf(stdout,"input stream:%d, output stream:%d\n",
97:                 status.sstat_instrms, status.sstat_outstrms);
98:         for(;;)
99:         {
100:             len = sizeof(&sinfo,sizeof(sinfo));
101:             memset(buf,0,buf_size);
102:             nread = sctp_recvmsg(client_sockfd,buf,buf_size,
103:                     (struct sockaddr*)&client_addr, &len, &sinfo, &flags);
104:             if(nread <= 0) break;
105:             fprintf(stdout,"%s\n",buf);
106:             fprintf(stdout,"read %d bytes on channel %d\n",
107:                     nread, sinfo.sinfo_stream);
108:         }
109:         close(client_sockfd);
110:     }
111:
112:     return 0;
113: }
114:

客户端程序

1: #include 
2: #include 
3: #include 
4: #include 
5: #include 
6: #include 
7: #include 
8: #include 
9:
10: const int buf_size = 1024;
11: const int echo_port = 2013;
12:
13: char *usage_msg = "usage echo_c ip_addr istreams ostream ochannel";
14: void usage()
15: {
16:     fprintf(stderr,"%s\n", usage_msg);
17:     exit(1);
18: }
19:
20: int main(int argc, char** argv)
21: {
22:     int sockfd, len;
23:     struct sockaddr_in serv_addr;
24:     struct sockaddr_in *addrs;
25:     int addr_size = 1;
26:
27:     char* msg = "hello world.\n";
28:     struct sctp_initmsg initmsg;
29:     struct sctp_status status;
30:     struct sctp_sndrcvinfo sinfo;
31:     int ochannel;
32:
33:     int brst;
34:
35:     if(argc < 5) usage();
36:     sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
37:     if(sockfd < 0)
38:     {
39:         fprintf(stderr,"error while initializing socket.\n");
40:         exit(1);
41:     }
42:
43:     addrs = malloc(sizeof(struct sockaddr_in));
44:     serv_addr.sin_family = AF_INET;
45:     serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
46:     serv_addr.sin_port = htons(echo_port);
47:
48:     memcpy(addrs,&serv_addr,sizeof(struct sockaddr_in));
49:     memset(&initmsg, 0, sizeof(initmsg));
50:     initmsg.sinit_max_instreams = atoi(argv[2]);
51:     initmsg.sinit_num_ostreams = atoi(argv[3]);
52:     fprintf(stdout,"asking for %d input stream, %d output stream.\n",
53:             initmsg.sinit_max_instreams,initmsg.sinit_num_ostreams);
54:
55:     brst = setsockopt(sockfd, IPPROTO_SCTP,SCTP_INITMSG,
56:             &initmsg,sizeof(initmsg));
57:     if(brst != 0)
58:     {
59:         fprintf(stderr,"error while set socket option.\n");
60:         exit(1);
61:     }
62:
63:     brst = sctp_connectx(sockfd, (struct sockaddr*) addrs, 1);
64:     if(brst < 0)
65:     {
66:         fprintf(stderr, "can not connect to host.\n");
67:         exit(1);
68:     }
69:
70:     memset(&status,0,sizeof(status));
71:     len = sizeof(status);
72:     status.sstat_assoc_id = 1;
73:
74:     brst = getsockopt(sockfd, IPPROTO_SCTP,SCTP_STATUS,&status,&len);
75:     if(brst < 0)
76:     {
77:         fprintf(stderr,"error while geting socket option.\n");
78:         exit(1);
79:     }
80:
81:     fprintf(stdout,"input stream:%d, output stream:%d\n",
82:             status.sstat_instrms,status.sstat_outstrms);
83:
84:     ochannel = atoi(argv[4]);
85:     if(ochannel >= status.sstat_outstrms)
86:     {
87:         fprintf(stdout,"writing on illegal channel %d \n", ochannel);
88:     }
89:
90:     bzero(&sinfo,sizeof(sinfo));
91:     sinfo.sinfo_stream = ochannel;
92:     sctp_send(sockfd, msg, strlen(msg), &sinfo, 0);
93:     sinfo.sinfo_flags = SCTP_EOF;
94:     sctp_send(sockfd,NULL,0,&sinfo,0);
95:
96:     close(sockfd);
97:     return 0;
98: }
99:

转载于:https://www.cnblogs.com/phirostt/p/4650520.html

你可能感兴趣的文章
day7.条件和循环
查看>>
(转)log4j(二)——如何控制日志信息的输出?
查看>>
JavaScript简介
查看>>
php.ini中safe_mode开启对PHP系统函数的影响
查看>>
gdb
查看>>
ubuntu清理旧内核
查看>>
Node之安装篇
查看>>
Android的Animation之LayoutAnimation使用方法
查看>>
二分图最大匹配算法-Hopcroft-Karp模板
查看>>
发布和订阅的删除
查看>>
使用LinQ进行增删改查
查看>>
关于iOS适配问题
查看>>
C语言博客作业--嵌套循环
查看>>
内部类 ( Inner Class )
查看>>
Linux 使用者 群组 权限
查看>>
【PAT】B1047 编程团体赛(20 分)
查看>>
iPad软件提交注意事项
查看>>
约束和异常处理
查看>>
css 布局
查看>>
RESTful风格化
查看>>