阻塞和非阻塞模式的转换问题
下面这段代码先把套接字设置为非阻塞模式,然后又设置为阻塞模式,其中的原因是什么? 还有就是,中间标注的那段代码的含义是什么?请高手帮我解释一下,谢谢!
{
......
m_SttnEqpSocket = socket(AF_INET, SOCK_STREAM, 0);
if( m_SttnEqpSocket < 0 )
{
TRACE("socket()[%d]\n", WSAGetLastError() );
return(-1);
}
//设置为非阻塞模式
nonblocking = 1;
if(ioctlsocket(m_SttnEqpSocket, FIONBIO, (unsigned long*)&nonblocking) == SOCKET_ERROR)
{
TRACE("ioctlsocket1()[%d]\n", GetLastError());
return(-1);
}
memset(&ServAddr, 0, sizeof(struct sockaddr_in));
ServAddr.sin_family = AF_INET;
ServAddr.sin_port = htons((u_short)nPORT);
ServAddr.sin_addr.s_addr = inet_addr(strIP_ADDR);
/* 2. connect the server */
nRet=connect(m_SttnEqpSocket, (LPSOCKADDR)&ServAddr,(int)sizeof(ServAddr));
if ( (nRet== SOCKET_ERROR) && (WSAGetLastError() != WSAEWOULDBLOCK) )
{
TRACE("connect()[%d]\n", GetLastError() );
Disconnect();
return (-1);
}
/* 3. select */
FD_ZERO(&wset);
FD_SET(m_SttnEqpSocket, &wset);
tval.tv_sec = CONNECT_TIME_OUT;
tval.tv_usec = 0;
if ( (nRet = select((int)m_SttnEqpSocket+1, NULL, &wset, NULL, &tval)) == 0)
{
/* connect timeout */
TRACE("Connect timeout! [%s:%d]\n", strIP_ADDR, nPORT );
Disconnect();
return (-1);
}
--------------------------------------------------------------------------------------------------标注的这段的意义是什么??
if (FD_ISSET(m_SttnEqpSocket, &wset))
{
nLen = sizeof(nError);
if (getsockopt(m_SttnEqpSocket, SOL_SOCKET, SO_ERROR , (char*)&nError, &nLen) < 0) {
/* pending error */
TRACE("getsockopt1()[%d] pending error\n", GetLastError() );
Disconnect();
return (-1);
}
if (nError)
{
TRACE("getsockopt2()[%d] nError[%d]\n", GetLastError(), nError );
Disconnect();
return (-1);
}
}
else
{
/* select error: m_hSocket not set */
Disconnect();
return (-1);
}
----------------------------------------------------------------------------------------------------------------
//设置为阻塞模式
nonblocking =0;
if(ioctlsocket(m_SttnEqpSocket, FIONBIO, (unsigned long*)&nonblocking) == SOCKET_ERROR)
{
TRACE("ioctlsocket2()[%d]\n", GetLastError() );
return(-1);
}
TRACE("Info : [%s:%d] connected.\n", strIP_ADDR, nPORT);
return NOERROR;
}