首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

SCTP 一对一方式(TCP)的服务器端代码

2013-09-06 
SCTP 一对一模式(TCP)的服务器端代码以下代码为基于sctp协议的一对一模式(TCP)的服务器端代码。#include s

SCTP 一对一模式(TCP)的服务器端代码

以下代码为基于sctp协议的一对一模式(TCP)的服务器端代码。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netinet/sctp.h>#include <unistd.h>#include <arpa/inet.h>  const int buf_size = 1024; const int echo_port = 19000;  char* usage_msg="usage: sctp_echo [ip_addr]+ istreams ostreams"; void usage() {     fprintf(stderr,"%s\n",usage_msg);     exit(1); }  int main(int argc, char** argv) {      char buf[buf_size];      int sockfd, client_sockfd,flags;     int nread,len;     struct sockaddr_in serv_addr, client_addr;     struct sctp_initmsg initmsg;     struct sctp_status status;          struct sctp_sndrcvinfo sinfo;                    int addr_count = 1;           if(argc < 4) usage();      sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);     if(sockfd < 0)     {         fprintf(stderr,"socket descriptor is invalid.");         exit(1);     }          serv_addr.sin_family = AF_INET;     serv_addr.sin_addr.s_addr = inet_addr(argv[1]);     serv_addr.sin_port = htons(echo_port);      int brst = sctp_bindx(sockfd,(struct sockaddr*)&serv_addr,                 addr_count,SCTP_BINDX_ADD_ADDR);     if(brst == -1)     {         fprintf(stderr,"error while binding address.");         exit(1);     }      memset(&initmsg,0,sizeof(initmsg));     initmsg.sinit_max_instreams = atoi(argv[2]);     initmsg.sinit_num_ostreams = atoi(argv[3]);     fprintf(stdout,"asking for input streams:%d, output streams %d\n",             initmsg.sinit_max_instreams, initmsg.sinit_num_ostreams);          brst = setsockopt(sockfd,IPPROTO_SCTP,SCTP_INITMSG,             &initmsg,sizeof(initmsg));     if(brst != 0)     {         fprintf(stderr,"error while setting sctp options.\n");         exit(1);     }      listen(sockfd,5);      for(;;)     {         len = sizeof(client_addr);         client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, (socklen_t*)&len);         if(client_sockfd == -1)         {             fprintf(stderr,"error while accepting connection, continue.\n");             continue;         }          memset(&status,0,sizeof(status));         len = sizeof(status);         status.sstat_assoc_id = 0;          brst = getsockopt(client_sockfd,IPPROTO_SCTP,SCTP_STATUS,&status,(socklen_t*)&len);         if(brst == -1)         {             fprintf(stderr,"error while getting socket option.\n");         }          fprintf(stdout,"input stream:%d, output stream:%d\n",                 status.sstat_instrms, status.sstat_outstrms);         for(;;)         {             len = sizeof(&sinfo);             memset(buf,0,buf_size);             nread = sctp_recvmsg(client_sockfd,buf,buf_size,                     (struct sockaddr*)&client_addr, (socklen_t*)&len, (sctp_sndrcvinfo*)&sinfo, &flags);             if(nread <= 0) break;             fprintf(stdout,"%s\n",buf);             fprintf(stdout,"read %d bytes on channel %d\n",                      nread, sinfo.sinfo_stream);          }         close(client_sockfd);     }      return 0; } 


热点排行