SCTP一對一模式(TCP)模式的客戶端代碼

以下代碼爲基於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)模式的客戶端代碼。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章