我设置套接字选项SO_RCVTIMEO,但实际上它不适用于UDP recvfrom()
系统调用?有人可以帮帮我吗?
答案 0 :(得分:0)
可能是你给出的超时太小而且它以EAGAIN作为错误返回-1。
答案 1 :(得分: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);