【发布时间】:2012-09-23 12:52:34
【问题描述】:
我设置了套接字选项 SO_RCVTIMEO 但它真的不适用于 UDP recvfrom() 系统调用?有人可以帮帮我吗?
【问题讨论】:
-
您可以粘贴您的代码,以便我们查找错误。一般应该没有问题
标签: c network-programming
我设置了套接字选项 SO_RCVTIMEO 但它真的不适用于 UDP recvfrom() 系统调用?有人可以帮帮我吗?
【问题讨论】:
标签: c network-programming
可能是您给出的超时太小,它返回 -1,EAGAIN 作为 errno。
【讨论】:
可能的错误可能是误用了 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);
【讨论】: