他俩干嘛了?一转身就可以了?

发布于 2022-10-15 05:49:38 字数 8174 浏览 12 评论 0

本帖最后由 Horizon2012 于 2011-05-28 10:51 编辑

  1. #include<sys/socket.h>
  2. #include<netinet/in.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<arpa/inet.h>
  6. #include<unistd.h>
  7. #define QUENE 10
  8. #define PORT  3001
  9. #define BUFSIZE 256
  10. int main(int argc,char**argv){
  11.         printf("sizeof(struct sockaddr)=%d\n",sizeof(struct sockaddr));
  12.         printf("sizeof(struct sockaddr_in)=%d\n",sizeof(struct sockaddr_in));
  13.        
  14.         unsigned int addrlen;
  15.         char buf[BUFSIZE];
  16.        
  17.         int hostfd;
  18.         int clientfd;
  19.         int ret;
  20.         int cnt;
  21.         struct sockaddr_in sock_host;
  22.         struct sockaddr_in sock_client;
  23.        
  24.         hostfd=socket(AF_INET,SOCK_STREAM,0);
  25.         if(hostfd==-1){
  26.                 perror("socket error");
  27.                 exit(1);
  28.         }
  29.         sock_host.sin_family=AF_INET;
  30.         sock_host.sin_port=htons(PORT);
  31.         sock_host.sin_addr.s_addr=INADDR_ANY;
  32.         //sock_host.sin_addr.s_addr=inet_addr("127.0.0.1");
  33.         memset(sock_host.sin_zero,0,sizeof(sock_host.sin_zero));
  34.        
  35.         ret=bind(hostfd,(struct sockaddr*)&sock_host,sizeof(struct sockaddr));
  36.         if(ret==-1){
  37.                 perror("bind error");
  38.                 exit(1);
  39.         }
  40.         printf("hostfd=%d\n",hostfd);
  41.         ret=listen(hostfd,QUENE);
  42.         if(ret==-1){
  43.                 perror("listen error");
  44.                 exit(1);
  45.         }
  46.         printf("Wait For the Client Connection.\n");
  47.         while(1){
  48.                 printf("hostfd=%d\n",hostfd);
  49.                 clientfd=accept(hostfd,(struct sockaddr*)&sock_client,&addrlen);
  50.                 if(clientfd==-1){
  51.                         perror("accept error");
  52.                         continue;
  53.                 }
  54.                 printf("Client IP:%s\n",inet_ntoa(sock_client.sin_addr));
  55.                 memset(buf,0,BUFSIZE);
  56.                 cnt=recv(clientfd,buf,BUFSIZE,0);
  57.                 if(cnt==-1){
  58.                         perror("recv error");
  59.                         exit(1);
  60.                 }
  61.                 printf("Received:%s\n",buf);
  62.                 close(clientfd);
  63.                 if (  strncmp(buf,"exit",4) == 0  ){
  64.                         break;
  65.                 }
  66.         }
  67.         close(hostfd);
  68.         return 0;
  69. }

复制代码

上面是服务器端的程序,请问有什么问题的会导致:
如果addrlen定义在buf之前的话,当客户端发送数据时,就会输出:
accept error: Invalid argument
如果buf定义在addrlen之前的话,当客户端发送数据时,就可以正常运行的??????

附加客户端程序如下:

  1. #include<stdio.h>
  2. #include<sys/types.h>
  3. #include<sys/socket.h>
  4. #include<netinet/in.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7. #include<arpa/inet.h>
  8. #include<unistd.h>
  9. #define PORT  3001
  10. #define BUFSIZE 256
  11. int main(int argc,char**argv){
  12.         int sockfd;
  13.         int ret;
  14.         int cnt;
  15.         char buf[BUFSIZE];
  16.         struct sockaddr_in sock_addr;
  17.        
  18.         if(argc!=2){
  19.                 printf("argument error");
  20.                 exit(1);
  21.         }
  22.         sockfd=socket(AF_INET,SOCK_STREAM,0);
  23.         if(sockfd==-1){
  24.                 perror("socket error");
  25.                 exit(1);
  26.         }
  27.         sock_addr.sin_family=AF_INET;
  28.         sock_addr.sin_port=htons(PORT);
  29.         //sock_addr.sin_addr.s_addr=INADDR_ANY;
  30.         sock_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
  31.         memset(sock_addr.sin_zero,0,sizeof(sock_addr.sin_zero));
  32.        
  33.         ret=connect(sockfd,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr));// 阻塞
  34.         if(ret==-1){
  35.                 perror("connect error");
  36.                 exit(1);
  37.         }
  38.         strcpy(buf,argv[1]);
  39.         cnt=send(sockfd,buf,BUFSIZE,0);
  40.         if(cnt==-1){
  41.                 perror("send error");
  42.                 exit(1);
  43.         }
  44.         printf("Send:%s\n",buf);
  45.         close(sockfd);
  46.        
  47.         return 0;
  48. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

懒猫 2022-10-22 05:49:38

确认只是修改两句定义的位置?

情绪操控生活 2022-10-22 05:49:38

我知道原因了{:3_200:},原来我在调用accept之前没有初始化addrlen
导致了accept error:invalid argument

  1. addrlen=sizeof(struct sockaddr);
  2. clientfd=accept(hostfd,(struct sockaddr*)&sock_client,&addrlen);

复制代码

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文