0

我设置了套接字选项 SO_RCVTIMEO 但它真的不适用于 UDPrecvfrom()系统调用吗?有人可以帮我吗?

4

2 回答 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 回答