在公司代码中看到如下设置socket connect函数超时的方法:
1.先调用WSAEventSelect将socket设置成非阻塞socket,示例:
WSAEventSelect(hSocket, hNetEvent, FD_WRITE| FD_READ | FD_CLOSE | FD_CONNECT);2.调用connect函数进行连接,如果返回错误,检测错误值是不是WSAEWOULDBLOCK,如果是再调用WaitForSingleObject或WaitForMultiObjects等待事件hNetSocket,在WaitForSingleObject或WaitForMultiObjects设置超时值。
3.如果在规定时间内连接成功以后,调用WSAEnumNetworkEvents检测是否是连接事件,示例代码:
<span style="white-space:pre"> </span>WSANETWORKEVENTS netEvents;
if (WSAEnumNetworkEvents(m_hSocket, m_eventNet.GetEvent(), &netEvents) != 0)
{
m_nLastError = WSAGetLastError();
WRITE_ERROR_LOG(RCMOBILE_MODDULE_CONNECT_GUID, _T(" RCAsyncSocket::Connect Error 04 WSAEnumNetworkEvents error with ErrorCode %d"), m_nLastError);
return false;
}
if ((netEvents.lNetworkEvents & FD_CLOSE) == FD_CLOSE)
{
m_nLastError = WSAGetLastError();
WRITE_ERROR_LOG(RCMOBILE_MODDULE_CONNECT_GUID, _T(" RCAsyncSocket::Connect Error 05 FD_CLOSE"));
return false;
}
if ((netEvents.lNetworkEvents & FD_CONNECT) == FD_CONNECT)
{
if (netEvents.iErrorCode[FD_CONNECT_BIT] != 0)
{
m_nLastError = WSAGetLastError();
WRITE_ERROR_LOG(RCMOBILE_MODDULE_CONNECT_GUID, _T(" RCAsyncSocket::Connect Error 06 FD_CONNECT error"));
return false;
}
}
send、recv函数类似。
本文介绍了如何在Windows环境下为socket的connect、send和recv函数设置超时。首先通过WSAEventSelect将socket设为非阻塞模式,然后使用connect尝试连接并检查WSAEWOULDBLOCK错误。如果发生此错误,则使用WaitForSingleObject或WaitForMultiObjects函数设置超时等待。若在规定时间内连接成功,通过WSAEnumNetworkEvents检查连接事件。send和recv函数的超时设置也遵循相似的逻辑。
1938

被折叠的 条评论
为什么被折叠?



