免费注册 查看新帖 |

Chinaunix

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

网络编程中循环收发数据问题(结题) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-31 21:02 |只看该作者 |倒序浏览
本帖最后由 goodstudy_linux 于 2011-11-01 22:03 编辑

编写完网络收发数据代码后,测试中出现了一些问题,调试了很久还是没有解决。
请高手指导,谢谢!
问题如下:
1、客服端能循环发送数据;
2、服务端也能循环接收数据;
3、当客服端先退出时:服务端仍然在不停地接收无数据的信息;
4、如果服务端先退出时,则出现另一个问题:当再次启动服务端和客服端时,出现无法连接的情况;
我原以为只是服务端的while语句放错了位置,但是当我把while语句放到accept函数之前,则服务端无法循环接收数据。
代码如下:
客服端代码
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>

int main()
{
        
    int my_socket = socket(AF_INET, SOCK_STREAM, 0);
        
    struct sockaddr_in  my_serveraddr;
        
    bzero(&my_serveraddr, sizeof(my_serveraddr));
        
    my_serveraddr.sin_family = AF_INET;
        
    my_serveraddr.sin_port = htons(6006);
        
    my_serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        
    int con_socket = connect(my_socket, (struct sockaddr*)&my_serveraddr, sizeof(my_serveraddr));
        
   if (con_socket ==  -1)
   {
        perror("connect failed: ");
        close(my_socket);
        return -1;
   }
               
   char  send_buf[1024];
   memset(send_buf, 0, 1024);
   while(1)
  {
      printf("Input your word:\n");
      fgets(send_buf, sizeof(send_buf), stdin);
      write(my_socket, send_buf, sizeof(send_buf));
   }        
   close(my_socket);
        
   return 0;
}
服务端代码:
#include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
      int my_socket = socket(AF_INET, SOCK_STREAM, 0);
     struct sockaddr_in  my_servaddr,my_clitaddr;
     socklen_t len;
        
     bzero(&my_servaddr, sizeof(my_servaddr));
     my_servaddr.sin_family = AF_INET;
     my_servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
     my_servaddr.sin_port = htons(6006);

     int bindSock = bind(my_socket,(struct sockaddr*)&my_servaddr,sizeof(my_servaddr));
     if(bindSock < 0)
    {
          perror("bind");
          return -1;
      }
        
     int listenSocket = listen(my_socket, 5);
     if(listenSocket < 0)
    {
          perror("listen");
          return -1;
      }
        
        
      len = sizeof(my_clitaddr);
      int        conn_socket = accept(my_socket, (struct sockaddr*)&my_clitaddr, &len);
      if(conn_socket <0 )
     {
           perror("accept");
           return -1;
       }
     
      char recv_buf[1024];

     while(1)
    {
          memset(recv_buf, 0, 1024);
          printf("The seerver is waiting the information:");
          printf("\n=======the recv informations======\n");
          int num = read(conn_socket, recv_buf, sizeof(recv_buf));
          printf("%s", recv_buf);
     }
   
     close(conn_socket);
     close(my_socket);
     return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP