C++套接字Windows

4

我有一个问题。

我创建了一个socket,连接上了,并发送了字节,一切都很好。

但是在接收数据时,我使用了recv函数。

char * TOReceive= new char[200];

recv(ConnectSocket, TOReceive , 200, 0);

当有一些数据被读取并成功返回时,如果没有数据等待,则我只需要限制等待时间。例如,如果10秒钟没有数据,它应该返回。

非常感谢。

3个回答

7

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,包括套接字已经关闭的情况。

请给一个小的例子: select(...); 之后接收什么? - Armen Khachatryan
也许我有点疯狂,但我更喜欢使用WSAEventSelectWaitForSingleObject而不是select。就像在Unix上我更喜欢使用poll一样。select已经过时了,看起来很奇怪。每次听到有人支持它,我都会感到一部分灵魂死去。 - asveikau
6
奇怪…你对那些死去的部分怎么处理? - Daniel Earwicker

0

在调用recv函数之前,您必须先调用select函数以了解是否有可读内容。


0

您可以使用SO_RCVTIMEO套接字选项来指定recv()调用的超时值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接