以下代码为基于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; }