码迷,mamicode.com
首页 > 其他好文 > 详细

SCTP 学习

时间:2015-07-16 11:35:52      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

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

apt-get install libsctp lksctp

服务端程序

  1: #include <stdio.h>
  2: #include <stdlib.h>
  3: #include <string.h>
  4: #include <sys/types.h>
  5: #include <sys/socket.h>
  6: #include <netinet/in.h>
  7: #include <netinet/sctp.h>
  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 <stdio.h>
  2: #include <stdlib.h>
  3: #include <string.h>
  4: #include <unistd.h>
  5: #include <sys/types.h>
  6: #include <sys/socket.h>
  7: #include <netinet/in.h>
  8: #include <netinet/sctp.h>
  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: 

SCTP 学习

标签:

原文地址:http://www.cnblogs.com/phirostt/p/4650520.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!