我使用recv
函数从套接字中读取数据。当没有可用数据时,我的程序就会停止运行。我发现可以使用select
函数设置超时时间。但是看起来超时时间只会影响select
函数本身,而在select
之后执行的recv
仍然会持续等待。
fd_set set;
struct timeval timeout;
FD_ZERO(&set); /* clear the set */
FD_SET(s, &set); /* add our file descriptor to the set */
timeout.tv_sec = SOCKET_READ_TIMEOUT_SEC;
timeout.tv_usec = 0;
int rv = select(s, &set, NULL, NULL, &timeout);
if((recv_size = recv(s , rx_tmp , bufSize ,0)) == SOCKET_ERROR)
{
...
}
如何在一定时间后让recv
函数返回?
SO_RCVTIMEO
的平台,但在其他平台上,输入参数通常是一个timeval
结构。Linux实现了SO_RCVTIMEO
(和SO_SNDTIMEO
)。OSX也是如此。 - Remy Lebeauerrno
代替WSAGetLastError()
。至于我的答案针对Windows的本质,是因为该问题标记为visual-c ++
,这意味着仅限于Windows开发。 - Remy Lebeau