程序中的代码:
timeout = 100;
ret = setsockopt(m_hSocket, SOL_SOCKET, SO_RCVTIMEO,
(char*)&timeout, sizeof(timeout));
if(ret == SOCKET_ERROR)
{
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
return FALSE;
}
ret = setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO,
(char*)&timeout, sizeof(timeout));
if (ret == SOCKET_ERROR)
{
if (m_hSocket != INVALID_SOCKET) {
closesocket(m_hSocket);
}
return FALSE;
}
在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
SO_RCVTIMEO and SO_SNDTIMEO
When using the recv function, if no data arrives during the period specified in SO_RCVTIMEO, the recv function completes.
If a send or receive operation times out on a socket, the socket state is indeterminate, and should not be used; 超时后不可靠,在此实例中,m_hSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); socket使用的协议是icmp,socket不可靠直接Close并返回FALSE。