//--连接网站主机设置为非阻塞模式 unsigned long ul = 1;
int ret = ioctlsocket(comm_socket,FIONBIO,(unsigned long*)&ul);
if(ret==SOCKET_ERROR)
{
DWORD r = WSAGetLastError();
closesocket(comm_socket);
WSACleanup();
return FALSE;
}
int rrr = 1 ;
while (rrr)
{
int rct ;
rct = connect(comm_socket, (sockaddr*)&comm_addr, len); rrr = WSAGetLastError(); if ( rct == SOCKET_ERROR)
{
struct timeval timeout ;
fd_set r; FD_ZERO(&r);
FD_SET(comm_socket, &r);
timeout.tv_sec = 30; //--设定超时为30秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
::closesocket(comm_socket);
WSACleanup();
return FALSE;
}
}
}
这样做为什么不对了 谁能指点一下吗
SOCKET sock; //初使化服务器地址
sTestPoint.sin_family=AF_INET;
sTestPoint.sin_port=htons(nPort);
sTestPoint.sin_addr.S_un.S_addr=inet_addr(pszIP); sock= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //设置发送超时
if(::setsockopt(sock
, SOL_SOCKET
, SO_SNDTIMEO,
(char *)&m_nTimeOut,
sizeof(m_nTimeOut)) == SOCKET_ERROR)
{
char pLog[100];
sprintf((char*)pLog, "设置[%s]发送超时失败", pszIP);
return false;
}
//设置接收超时
if(::setsockopt(sock
,SOL_SOCKET
,SO_RCVTIMEO,
(char *)&m_nTimeOut,
sizeof(m_nTimeOut))==SOCKET_ERROR)
{
char pLog[100];
sprintf((char*)pLog, "设置[%s]接收超时失败", pszIP);
return false;
}
//设置非阻塞方式连接
unsigned long ul = 1;
int nRet = ioctlsocket(sock, FIONBIO, (unsigned long*)&ul);
if(nRet == SOCKET_ERROR)
{
char pLog[100];
sprintf((char*)pLog, "设置[%s]非阻塞方式连接失败", pszIP);
return false;
}
nRet= connect(sock,(LPSOCKADDR)&sTestPoint,sizeof(sTestPoint)); //select 模型,即设置超时
struct timeval timeout ;
fd_set r; FD_ZERO(&r);
FD_SET(sock, &r); timeout.tv_sec = m_nTimeOut; //连接超时
timeout.tv_usec =0; nRet = select(0, 0, &r, 0, &timeout); if (nRet <= 0 )
{
char pLog[100];
sprintf((char*)pLog, "无法连通[%s]的[%d]端口", pszIP, nPort);
::closesocket(sock);
return false;
}//do something............ shutdown(sock, 1);
closesocket(sock);
{
char pLog[100];
...
} 请问这里的 nRet 是哪个的返回值了 程序上是 select 的返回
这些代码是项目代码中的一部分,已经测试通过的。
nRet = select(0, 0, &r, 0, &timeout); nRet = 1 ;说明有返回 那么就会继续执行,这样下面的一些操作都是在没有连接成功的情况
下执行的,所以我后面的发送的请求没有得到数据
说明已经连接成功了。