如何快速判断是否能打开TCP连接

lin152 2011-04-18 02:46:45
如下代码是我的程序打开Tcp连接的部分。
我希望能够快速的判断出是否能够连接上,马上返回,可是实际上最快要4S钟,最慢的要10多S呢?
求牛人帮忙。。。

BOOL CTcpip::Open ()
{
if( 0 == m_dwIpAddress)
{return FALSE;}
m_nCommunicateFailTimes = 0;

struct sockaddr_in server;
int rval;
unsigned long argp=1;
struct timeval tv;
fd_set fd;
time_t t1, t2;

memcpy( &(server.sin_addr),&m_dwIpAddress,sizeof(server.sin_addr) );
server.sin_port = htons( m_nPort );
server.sin_family = AF_INET;
Close();
if(clisock == NULL)
clisock = socket(AF_INET,SOCK_STREAM,0);
if (clisock <= 0)
{
return FALSE;
}

ioctlsocket( clisock,FIONBIO,&argp );
SetRecvTimeout();

time (&t1) ;
t2 = t1 + 1 ; // 1S 最长的connect时间

while( TRUE )
{
if( WaitForSingleObject(hCommunicateEnable, 10) == WAIT_OBJECT_0 )
{break;}
rval = connect(clisock, (struct sockaddr *)&server, sizeof(server)) ;

if (rval != 0)
{
FD_ZERO( &fd );
FD_SET( clisock,&fd );
tv.tv_sec = 0;
tv.tv_usec = 500000L;
if( (rval = select( 0,NULL,&fd,NULL,&tv )) <= 0 )
{

time(&t1);
if( t1 > t2)
{
Close();
return FALSE;
}
}
else
{
return TRUE;
}
}
else
{
return TRUE;
}
time(&t1);
if( t1 > t2)
{
Close();
return FALSE;
}
}
TRACE( _T("Get program exit signal!!\n" ));
Close();
return FALSE;
}
...全文
162 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin152 2011-04-20
  • 打赏
  • 举报
回复
继续求解。。。
lin152 2011-04-20
  • 打赏
  • 举报
回复
为什么这个tv设置成0S,也不能立即返回阿? 昏倒阿。
if( (rval = select( 0,NULL,&fd,NULL,&tv )) <= 0 )
lin152 2011-04-19
  • 打赏
  • 举报
回复
FD_ZERO( &fd );
FD_SET( clisock,&fd );
tv.tv_sec = 0;
tv.tv_usec = 500000L;
if( (rval = select( 0,NULL,&fd,NULL,&tv )) <= 0 ) // 为什么这里500ms后不能立即退出?
真相重于对错 2011-04-18
  • 打赏
  • 举报
回复
用半相关扫描,
http://tieba.baidu.com/f?kz=519907660
zk0233 2011-04-18
  • 打赏
  • 举报
回复
设置连接超时时间
lin152 2011-04-18
  • 打赏
  • 举报
回复
近一步测试发现,
如果该IP是的,回复会很快。
要是没有就慢很多。
如何控制这个响应时间呢。。。
lin152 2011-04-18
  • 打赏
  • 举报
回复
自己顶起。。。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧