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