SO_RCVTIMEO套接字选项不适用于recvfrom()

时间:2012-09-23 12:52:35

标签: c network-programming

我设置套接字选项SO_RCVTIMEO,但实际上它不适用于UDP recvfrom()系统调用?有人可以帮帮我吗?

2 个答案:

答案 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);