我设置了套接字选项 SO_RCVTIMEO 但它真的不适用于 UDPrecvfrom()
系统调用吗?有人可以帮我吗?
user1680544
问问题
878 次
2 回答
0
可能是您给出的超时太小,它返回 -1,EAGAIN 作为 errno。
于 2012-09-24T13:06:51.190 回答
0
可能的错误可能是滥用 select() 函数。不要忘记检查其结果是否为零。
代码应该是这样的:
int nRes = 0;
fd_set socketset;
memset(&socketset, 0, sizeof(socketset));
socketset.fd_count = 1;
socketset.fd_array[0] = sock;
timeval timeout = {0, 0};
timeout.tv_sec = dwTimeout / 1000;
timeout.tv_usec = (dwTimeout % 1000) * 1000; // microseconds
nRes = select(0, &socketset, NULL, NULL, &timeout);
if (nRes == SOCKET_ERROR)
{
return WSAGetLastError();
}
if (nRes == 0) // timeout
{
return WSAETIMEDOUT;
}
int nDestLen = sizeof(dest);
nRes = recvfrom (sock, (char*) &buf[0], buf.size(), 0,
(sockaddr*) &dest, &nDestLen);
于 2013-11-08T01:05:49.027 回答