Winsock TCP连接失败时长时间挂起的解决办法
2008-02-27 21:48
239 查看
采用tcp协议,如果连接一个无效的ip地址, 将会有20s左右的阻塞时间。这是由于采用Nagel算法和blocking模式导致的,解决办法:
static int TryConnect( SOCKET s, const struct sockaddr FAR *name, int namelen, int timeout )
{
fd_set fsWrite;
struct timeval tvTimeout;
ULONG uNonBlocked=1;
tvTimeout.tv_sec = 0;
tvTimeout.tv_usec = timeout*1000;
/* 设置为非阻塞模式进行连接 */
uNonBlocked = 1;
if( ioctlsocket(s, FIONBIO, (ULONG *)&uNonBlocked) == SOCKET_ERROR )
return -1;
if( connect(s, name, namelen) == SOCKET_ERROR)
{
if( WSAGetLastError() == WSAEWOULDBLOCK )
{
FD_ZERO(&fsWrite);
FD_SET(s, &fsWrite);
if( select(s+1, NULL, &fsWrite, NULL, &tvTimeout) < 0 )
{
return -1;
}
if( !FD_ISSET(s, &fsWrite) )
{
return -1;
}
/* 设置为阻塞模式进行通讯 */
uNonBlocked = 0;
if( ioctlsocket(s, FIONBIO, (ULONG *)&uNonBlocked) == SOCKET_ERROR )
{
DPRINT("dd/n");
return -1;
}
}
else
return -1;
}
uNonBlocked = 0;
if( ioctlsocket(s, FIONBIO, &uNonBlocked) == SOCKET_ERROR )
return -1;
return 0;
}
static int TryConnect( SOCKET s, const struct sockaddr FAR *name, int namelen, int timeout )
{
fd_set fsWrite;
struct timeval tvTimeout;
ULONG uNonBlocked=1;
tvTimeout.tv_sec = 0;
tvTimeout.tv_usec = timeout*1000;
/* 设置为非阻塞模式进行连接 */
uNonBlocked = 1;
if( ioctlsocket(s, FIONBIO, (ULONG *)&uNonBlocked) == SOCKET_ERROR )
return -1;
if( connect(s, name, namelen) == SOCKET_ERROR)
{
if( WSAGetLastError() == WSAEWOULDBLOCK )
{
FD_ZERO(&fsWrite);
FD_SET(s, &fsWrite);
if( select(s+1, NULL, &fsWrite, NULL, &tvTimeout) < 0 )
{
return -1;
}
if( !FD_ISSET(s, &fsWrite) )
{
return -1;
}
/* 设置为阻塞模式进行通讯 */
uNonBlocked = 0;
if( ioctlsocket(s, FIONBIO, (ULONG *)&uNonBlocked) == SOCKET_ERROR )
{
DPRINT("dd/n");
return -1;
}
}
else
return -1;
}
uNonBlocked = 0;
if( ioctlsocket(s, FIONBIO, &uNonBlocked) == SOCKET_ERROR )
return -1;
return 0;
}
相关文章推荐
- jsp,使用jdbc连接数据库出现“到主机的TCP/ip连接失败”的解决办法
- SQLServerException: 到主机的TCP/IP 连接失败解决办法
- 使用jdbc连接数据库出现“到主机的TCP/ip连接失败”的解决办法
- sqlserver2005获取连接失败解决办法
- sql2005用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联 解决办法
- 解决办法之“超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小 ”
- iphone4s连接电脑无法识别iphone设备:Apple Mobile Device USB Driver驱动安装失败显示黄色叹号解决办法
- linux网络有线连接失败“设备未托管” 解决办法
- 【Linux】SSH连接远程主机等待时间很长的解决办法
- mysql只能localhost连接,其他ip连接失败的解决办法
- VS2010 连接程序失败的解决办法
- 下载软件仓库信息失败,检查您的internet连接--解决办法
- 新版本kali-2017中部署dvwa后数据库连接失败的解决办法
- PowerDesigner15连接Oracle失败的解决办法
- Android开发中adb启动失败adb连接异常的解决办法
- mysql中连接失败2003(Can't connect to server on 'localhost'(10038))错误解决办法
- window xp,oracle数据库、plsql的tns连接失败,的解决办法。
- 解决问题的记录【一】TCP连接过多导致新连接创建失败
- 火狐 Firefox https 访问时出现安全连接失败提示: 在服务器密钥交换握手信息中 SSL 收到了一个弱临时 Diffie-Hellman 密钥 解决办法
- 远程连接阿里云MySQL失败解决办法