我有一个问题。
我创建了一个socket,连接上了,并发送了字节,一切都很好。
但是在接收数据时,我使用了recv函数。
char * TOReceive= new char[200];
recv(ConnectSocket, TOReceive , 200, 0);
当有一些数据被读取并成功返回时,如果没有数据等待,则我只需要限制等待时间。例如,如果10秒钟没有数据,它应该返回。
非常感谢。
Windows sockets有一个名为select
的函数。你需要传入socket句柄和要检查可读性的socket,还有超时时间,它会返回这个socket是否变得可读或者是否已经超时。
参考链接: http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx
下面是具体操作方法:
bool readyToReceive(int sock, int interval = 1)
{
fd_set fds;
FD_ZERO(&fds);
FD_SET(sock, &fds);
timeval tv;
tv.tv_sec = interval;
tv.tv_usec = 0;
return (select(sock + 1, &fds, 0, 0, &tv) == 1);
}
recv
应该立即返回一些数据。select
的错误返回值并在这些情况下抛出异常来使其更加健壮。在这里,如果它表示一个句柄准备好读取,我只返回true
,但这意味着我在所有其他情况下都返回false
,包括套接字已经关闭的情况。在调用recv
函数之前,您必须先调用select
函数以了解是否有可读内容。
您可以使用SO_RCVTIMEO套接字选项来指定recv()调用的超时值。
WSAEventSelect
和WaitForSingleObject
而不是select
。就像在Unix上我更喜欢使用poll
一样。select
已经过时了,看起来很奇怪。每次听到有人支持它,我都会感到一部分灵魂死去。 - asveikau