以下代码为基于sctp协议一对一模式(TCP)模式的客户端代码.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <arpa/inet.h>
const int buf_size = 1024;
const int echo_port = 19000;
char *usage_msg = "usage echo_c ip_addr istreams ostream ochannel";
void usage()
{
fprintf(stderr,"%s\n", usage_msg);
exit(1);
}
int main(int argc, char** argv)
{
int sockfd, len;
struct sockaddr_in serv_addr;
struct sctp_initmsg initmsg;
struct sctp_status status;
struct sctp_sndrcvinfo sinfo;
int ochannel;
if(argc < 5) usage();
sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
if(sockfd < 0)
{
printf("error while initializing socket.\n");
exit(1);
}
struct sockaddr_in *addrs = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(echo_port);
memcpy(addrs,&serv_addr,sizeof(struct sockaddr_in));
memset(&initmsg, 0, sizeof(initmsg));
initmsg.sinit_max_instreams = atoi(argv[2]);
initmsg.sinit_num_ostreams = atoi(argv[3]);
printf("asking for %d input stream, %d output stream.\n", initmsg.sinit_max_instreams,initmsg.sinit_num_ostreams);
int brst = setsockopt(sockfd, IPPROTO_SCTP,SCTP_INITMSG, &initmsg,sizeof(initmsg));
if(brst != 0)
{
printf("error while set socket option.\n");
exit(1);
}
brst = sctp_connectx(sockfd, (struct sockaddr*) addrs, 1);
if(brst < 0)
{
printf("can not connect to host.\n");
exit(1);
}
memset(&status,0,sizeof(status));
len = sizeof(status);
status.sstat_assoc_id = 1;
brst = getsockopt(sockfd, IPPROTO_SCTP,SCTP_STATUS,&status,(socklen_t*)&len);
if(brst < 0)
{
printf("error while geting socket option.\n");
exit(1);
}
printf("input stream:%d, output stream:%d\n", status.sstat_instrms,status.sstat_outstrms);
ochannel = atoi(argv[4]);
if(ochannel >= status.sstat_outstrms)
{
printf("writing on illegal channel %d \n", ochannel);
}
while(true)
{
bzero(&sinfo,sizeof(sinfo));
printf("input a message: ");
char buff[100];
bzero(buff, 100);
scanf("%s", buff);
printf("input ochannel:");
scanf("%d", &ochannel);
sinfo.sinfo_stream = ochannel;
sctp_send(sockfd, buff, strlen(buff), &sinfo, 0);
}
close(sockfd);
return 0;
}
以下代码为基于SCTP协议的一对一模式(TCP)模式的客户端代码。