Linux C socket传输结构体

服务器端:

   #include<stdio.h>
   #include<stdlib.h>
   #include<string.h>
   #include<sys/types.h>
   #include<sys/socket.h>
   #include<netinet/in.h>
   #include<arpa/inet.h>

  #define server_port 5000
  #define MAXPENDING 1000
  struct USERDATA
  {
          char name[30];
          char passwd[30];
  };
 int HandleTCPClient(int clntSocket,struct USERDATA *userdata);
 int HandleTCPClient(int clntSocket,struct USERDATA *userdata)
 {
         char buffer[BUFSIZ];
         ssize_t  numBytesRcvd = recv(clntSocket,buffer,BUFSIZ-1,0);
         if(numBytesRcvd < 0)
         {
                 fputs("recv() failed!\n",stderr);
                 send(clntSocket,"false",(size_t)strlen("false"),0);
                 return -1;
         }
         //printf("num = %d\n",strlen(buffer));
         memcpy(userdata,buffer,sizeof(struct USERDATA));
         // 第三个属性的长度不能超过第一个属性的存储空间否则会出现内存非法。
         return 0;
 }
 void main()
 {
         int servSock;
         if((servSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)
      {
                 printf("socket() failed!\n");
                 exit(1);
         }
         struct sockaddr_in servAddr;
         memset(&servAddr,0,sizeof(servAddr)) ;
         servAddr.sin_family = AF_INET;
         servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
         servAddr.sin_port = htons(server_port);

         if(bind(servSock,(struct sockaddr *)&servAddr,sizeof(servAddr)) <0)
         {
                 printf("bind() failed!\n");
                 exit(1);
         }

         if(listen(servSock,MAXPENDING) < 0)
         {
                 printf("listen() failed!\n");
                 exit(1);
         }
        for(;;)
         {
               struct sockaddr_in clntAddr;
               socklen_t clntAddrLen = sizeof(clntAddr);
               int clntSock = accept(servSock,(struct sockaddr *)&clntAddr,&clntAddrLen);

           if(clntSock < 0)
               {
                        fputs("accpet() failed!\n",stderr);
                       continue;
               }
               char clntName[INET_ADDRSTRLEN];
               if(inet_ntop(AF_INET,&clntAddr.sin_addr.s_addr,clntName,sizeof(clntName)) == NULL)
            fputs("Unable to get client address!\n",stderr);
            struct USERDATA  userdata;
            int result = HandleTCPClient(clntSock,&userdata);
            if(result < 0)
            {
                 send(clntSock,"false",(size_t)strlen("false"),0);
                     close(clntSock);
            }
           else
           {
                  send(clntSock,"true",(size_t)strlen("true"),0);
                  close(clntSock);
                  puts(userdata.name);
                  puts(userdata.passwd);
        }
        }
  }

客户端代码:

  #include<stdio.h>
  #include<stdlib.h>
  #include<string.h>
  #include<unistd.h>
  #include<sys/types.h>
  #include<netinet/in.h>
  #include<arpa/inet.h>

  struct USERDATA
  {
      char name[30];
      char passwd[30];
  };
  void DieWithUserMessage(const char *msg,const char *detail);//错误处理
  void DieWithSystemMessage(const char *msg);//错误处理
  void DieWithUserMessage(const char *msg,const char *detail){

      fputs(msg,stderr);
      fputs(": ",stderr);
      fputs(detail,stderr);
      fputc('\n',stderr);
      exit(1);
  }
  void DieWithSystemMessage(const char *msg){
      perror(msg);
      exit(1);
  }
  int main(){

      char *servIP = "139.129.39.100";

      in_port_t servPort = 5000;
      int sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

      if(sock < 0)
          DieWithSystemMessage("socket() failed!\n");
 struct sockaddr_in servAddr;
      memset(&servAddr,0,sizeof(servAddr));
      servAddr.sin_family = AF_INET;

      int rtnVal = inet_pton(AF_INET,servIP,&servAddr.sin_addr.s_addr);

      if(rtnVal == 0)
          DieWithUserMessage("inet_pton() failed!","invalid address string");

      servAddr.sin_port = htons(servPort);

      if(connect(sock,(struct sockaddr *)&servAddr,sizeof(servAddr)) < 0)
          DieWithSystemMessage("connect() failed!\n");

      struct USERDATA userdata;
      memcpy(userdata.name,"kakarot",sizeof("kakarot"));
      memcpy(userdata.passwd,"1235656",sizeof("1235656"));

      puts(userdata.name);
      puts(userdata.passwd);
      ssize_t numBytes = send(sock,(char *)&userdata,sizeof(userdata),0);

      if(numBytes < 0)
          DieWithSystemMessage("send() failed!\n");
      else if(numBytes != sizeof(userdata))
          DieWithUserMessage("send()","sent unexpected number of bytes");

      //unsigned int totalBytesRcvd = 0;
      fputs("Received: ",stdout);


      char buffer[BUFSIZ];

      numBytes = recv(sock,buffer,BUFSIZ -1,0);

      if(numBytes < 0)
         DieWithSystemMessage("recv() failed!\n");
      else if(numBytes == 0)
          DieWithUserMessage("recv()","connection closed prematurely!");
      //totalBytesRcvd += numBytes;
      //  puts(buffer);
      int creatResult = strcmp(buffer,"false");
      if(creatResult > 0)
      {
          puts("true");
      }
      else
      {
          puts("false");
      }


      //  fputs(buffer,stdout);

      fputc('\n',stdout);

      close(sock);
      exit(0);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值