免费注册 查看新帖 |

Chinaunix

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

[tcp]客户端connect成功但服务器没accept [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-27 22:43 |只看该作者 |倒序浏览
自己写的TCP服务程序,客户端非正常关闭软件几次以后,会产生这种现象:客户端connect成功,但服务器程序没accept,求解。
服务器端部分代码如下

  1. if (setsockopt(slisten, SOL_SOCKET, SO_REUSEADDR, &option, sizeof( option )) < 0) {
  2.                 printf( "setsockopt\n" );
  3.         }
  4.        
  5.        
  6.         if (bind(slisten, (struct sockaddr *)&local_addr, sizeof(local_addr)) == -1) {
  7.                 log("tcp server bind error\n");
  8.                 perror("bind\n");
  9.                 // exit(1);
  10.         }
  11.        
  12.         if(listen(slisten,20) != 0){
  13.                 log("监听失败\n");
  14.                 return 0;
  15.                
  16.         }

  17.         for(i=0; i<MAX_CLIENT_NO; i++) {
  18.         client[i].fd = -1;
  19.     }

  20.     FD_ZERO(&allset);           
  21.     FD_SET(slisten, &allset);
  22.         maxfd_net = slisten+1;
  23.         printf("maxfd_net = %d\n",maxfd_net);
  24.    
  25.         printf("Waiting for connections and data...\n");

  26. net_ready= select(maxfd_net, &rset, NULL, NULL, &tv);
  27.        
  28.         if(net_ready == -1)
  29.         {
  30.                 log("[tcp_sever]select error\n");
  31.                 perror("select:\n");
  32.         }
  33.         if(net_ready > 0)
  34.         {
  35.                
  36.                 if(FD_ISSET(slisten,&rset))
  37.                 {
  38.                         len=sizeof(struct sockaddr);
  39.                         if((connect_fd = accept(slisten,(struct sockaddr*)&remote_addr,&len)) == -1)
  40.                         {
  41.                                 printf("accept error\n");
  42.                                 log("[tcp server]accept error\n");
  43.                                 return;
  44.                         }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-01-28 09:03 |只看该作者
rset没看见

论坛徽章:
0
3 [报告]
发表于 2010-01-28 09:08 |只看该作者

回复 #1 marco_hxj 的帖子

应该是客户端非正常关闭导致服务器端存在“半”连接吧,然后没有可用资源给新的客户端使用

论坛徽章:
0
4 [报告]
发表于 2010-01-28 17:01 |只看该作者
客户端非正常退出,服务器能正确recv -1,但是客户端非正常退出几次以后,客户端能连接成功,我在服务器端也能看到establish状态,但是服务器程序里accpt就没执行到,listen的backlog的值是足够大的,服务器和客户端是1对1通讯

[ 本帖最后由 marco_hxj 于 2010-1-28 17:18 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
5 [报告]
发表于 2010-01-28 19:41 |只看该作者
很奇怪

[ 本帖最后由 xinglp 于 2010-1-28 19:44 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2010-02-01 16:20 |只看该作者
单单这段代码是无法定位你的问题的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP