关于SELECT连接超时的问题
一个连接对方指定端口的程序,使用下边的代码进行连接.遇到几个问题:
1、在有的计算机上,如果连接的IP没有监听指定的端口,SELECT马上就能返回,但是返回值为1,也就是显示连接成功;
2、在另外有的计算机上,如果连接的IP存在但没有监听指定的端口,SELECT直到15秒后才返回超时,而直接使用阻塞模式的Connect回马上返回连接错误。
请大虾指点迷津
BOOL MyConnect(CSocket &s,LPCTSTR dip,int dport)
{
WSADATA wsd;
int ret;
struct sockaddr_in server;
hostent *host=NULL;
if(WSAStartup(MAKEWORD(2,0),&wsd))
return FALSE;
//set Recv and Send time out
int TimeOut=6000;
if(::setsockopt(s.m_hSocket,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
return FALSE;
TimeOut=6000;
if(::setsockopt(s.m_hSocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
return FALSE;
unsigned long ul = 1;
ret = ioctlsocket(s.m_hSocket, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)
return FALSE;
server.sin_family = AF_INET;
server.sin_port = htons(dport);
server.sin_addr.s_addr = inet_addr((LPCSTR)dip);
if(server.sin_addr.s_addr == INADDR_NONE)
return FALSE;
connect(s.m_hSocket,(const struct sockaddr *)&server,sizeof(server));
struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(s.m_hSocket, &r);
timeout.tv_sec = 15;
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
return FALSE;
}
WSAEventSelect(s.m_hSocket,(WSAEVENT)&r,0);
unsigned long ul1= 0 ;
ret = ioctlsocket(s.m_hSocket, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR)
return FALSE;
else
return TRUE;
}