Linux C socket传输结构体

来源:互联网 发布:互联网供应链金融数据 编辑:程序博客网 时间:2024/05/24 02:36

服务器端:

   #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);
0 0
原创粉丝点击