CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

关于connect超时的问题,请大家指教

楼主ccaccbccc(好吃的雪糕)2006-11-03 17:42:41 在 VC/MFC / 网络编程 提问

由于系统默认的connect超时时间有点长,所以我想自己设定connect超时时间的值,采用的是非阻塞模式+select的方法,就在下面:  
   
                    SOCKET   hsocket       =       socket(AF_INET,       SOCK_STREAM,       IPPROTO_TCP);        
  unsigned   long   ul   =   1;         //首先设置为非阻塞模式  
                    int     ret   =   ioctlsocket(hsocket,   FIONBIO,   (unsigned   long*)&ul);  
  if(ret==SOCKET_ERROR)return;  
                     
                    //连接一台PC  
  connect(hsocket,       (LPSOCKADDR)&saServer,       sizeof(SOCKADDR_IN));        
   
  struct   timeval   timeout   ;  
  fd_set   r;  
   
  FD_ZERO(&r);                  
  FD_SET(hsocket,   &r);           //设置slect参数  
  timeout.tv_sec   =   0;             //设置超时时间  
  timeout.tv_usec   =10000;  
  ret   =   select(0,   0,   &r,   0,   &timeout);   //通过判断socket是否可写  
                                                                                              //来判断连接是否成功  
  if   (   ret   <=   0   )  
  {  
  printf("connect   fail\n");  
  }  
  else  
  {  
  printf("connect   success\n");  
  }  
   
   
                可是在程序运行前断开与目标PC的连接,然后运行程序,在超时时间之前恢复与目标PC的连接,仍然显示连接失败。我这么做哪里有错误呢,有什么办法能够正确设置超时时间啊?   刚刚开始接触网络方面的东西,请大家多多帮忙。  
  问题点数:100、回复次数:5Top

1 楼daiybh()回复于 2006-11-03 17:57:13 得分 25

http://blog.bcchinese.net/v45072501/archive/2006/06/05/73642.aspx  
  看看这..Top

2 楼nuaawenlin(飘人)回复于 2006-11-03 21:25:54 得分 25

这就要看看tcp的keepalive时间了,不过你等待10秒,估计是少了些Top

3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2006-11-03 21:41:35 得分 25

用一个ConnectHelper线程来做?如果超规定的时间都没连接成功,关闭Socket,终止线程?Top

4 楼baojian88888(机器人)回复于 2006-11-06 10:34:11 得分 25

tcp的连接过程是需要三次握手的(syn,   syn/ack,   ack),你这样pc断开连接,三次握手都不能进行吧Top

5 楼ccaccbccc(好吃的雪糕)回复于 2006-11-06 11:20:05 得分 0

大家好,我是楼主。如果在Linux下使用非阻塞模式+Select,使用起来是正常的。所以感觉很是奇怪,呵呵。  
   
  To   daiybh()   我就是从那篇文章中学到的这个办法的,^_^  
  To   nuaawenlin(飘人)     tcp的keepalive时间默认应该是7200秒,我再把等待时间设的长些试试  
  To   DentistryDoctor(不在无聊中无奈,就在沉默中变态)   这是一个好办法,我尝试一下。  
  To   baojian88888(机器人)   可是在Linux下却是可以的,select模型我也不是很熟悉,迷惑中  
   
  谢谢大家的帮助    
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:ccaccbccc
  • daiybh
  • nuaawenlin
  • DentistryDoctor
  • baojian88888

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo