免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1025 | 回复: 4
打印 上一主题 下一主题

又来麻烦大家啦!socket接收数据出了问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-23 16:07 |只看该作者 |倒序浏览
大家好!
我的这个服务器端的socket程序不能接受数据,recv地返回值始终<=0,大家帮我看看哪里出了问题。谢谢啦!
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<errno.h>
  4. #include<string.h>
  5. #include<sys/types.h>
  6. #include<netinet/in.h>
  7. #include<sys/socket.h>
  8. #include<sys/wait.h>
  9. #include<arpa/inet.h>

  10. # define SERVPORT 1029 /*server listening port*/
  11. # define BACKLOG 10 /*allow total number of connection*/
  12. # define MAXBUFLEN 2048

  13. main()
  14. {
  15.   int bytesNum;
  16.   char buf[MAXBUFLEN];
  17.   int sockfd,client_fd; /*sock_fd: listening Socket;sock_fd: Data Transfer Socket*/
  18.   struct sockaddr_in my_addr; /*local PC address info*/
  19.   struct sockaddr_in remote_addr; /*remote PC address info */
  20.   
  21.   
  22.   if((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)
  23.     {
  24.       perror("create Socket Error!");
  25.       exit(1);
  26.     }
  27.   
  28.   bzero(&my_addr,sizeof(my_addr));
  29.   my_addr.sin_family = AF_INET;  /*there is a quescstion here:as I have two network card*/
  30.   my_addr.sin_port = htons(SERVPORT);
  31.   my_addr.sin_addr.s_addr = inet_addr("192.168.0.6");/*IP Address  Also has a quesstion*/
  32.   // bzero(&(my_addr.sin_zero),8);

  33.   /*
  34.   if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(my_addr)) == -1)
  35.     {
  36.       //perror("bind Error!");
  37.       printf("bind error is %s\n", strerror(errno));

  38.      exit(1);
  39.     }
  40.   */
  41.   int i_bind_return = bind(sockfd,(struct sockaddr *)&my_addr,sizeof(my_addr));
  42.   printf("bind func return: %d\n", i_bind_return);
  43.    
  44.   if ( i_bind_return == -1 )
  45.    {
  46.      perror("bind error");
  47.      exit(1);
  48.    }

  49.   if(listen(sockfd,BACKLOG) == -1)
  50.     {
  51.       perror("listen Error!");
  52.       exit(1);
  53.     }
  54.   while(1)
  55.     {
  56.       printf("waiting for remote connection \n");
  57.       int sin_size = sizeof(struct sockaddr_in);
  58.       if((client_fd = accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size))==-1)
  59.         {
  60.           perror("accept Error");
  61.           continue;
  62.         }
  63.       // char *s_remote_addr = inet_ntoa(remote_addr.sin_addr);
  64.        printf("received a connection from %s\n",inet_ntoa(remote_addr.sin_addr));
  65.       [b]if(!fork())
  66.         {
  67.            printf("waiting for SN code! \n");
  68.           // if(send(client_fd,"Hello,you are connected!\n",26,0) == -1)
  69.           // {
  70.           //    perror("send Error!");
  71.           //  }
  72.           do
  73.             {
  74.               memset(buf,0,sizeof(buf));
  75.               /* if((bytesNum = recv (sockfd,buf,MAXBUFLEN,0)) == -1)
  76.                 {
  77.                   printf("%d \n" ,bytesNum);
  78.                   perror("recv Error!");
  79.                   }*/
  80.               if((bytesNum = recv (sockfd,buf,MAXBUFLEN,0)) <= 0)
  81.                 {
  82.                   printf("ending connection!");
  83.                 }
  84.               else
  85.                 printf("Packet is %s \n",buf);
  86.             }while(bytesNum>0);
  87.           close(client_fd);
  88.           exit(0);
  89.         }
  90.     }
  91.   
  92. }[/b]

复制代码

论坛徽章:
0
2 [报告]
发表于 2006-06-23 16:09 |只看该作者
前面正常,大家帮我看看fork以后的部分吧

论坛徽章:
0
3 [报告]
发表于 2006-06-23 16:16 |只看该作者
建议把<0 和==0的判断分开
<0是出错; ==0是socket关闭
再用perror仔细看看出的什么错

另外,好像这段程序会造成socket泄露

论坛徽章:
0
4 [报告]
发表于 2006-06-23 16:26 |只看该作者
if((bytesNum = recv (clientfd,buf,MAXBUFLEN,0)) <= 0)

论坛徽章:
0
5 [报告]
发表于 2006-06-23 16:29 |只看该作者
fork  里面怎么还用 socket 呢,
当然用你的 client_fd 啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP