【问题标题】:non blocking socket in c++C++中的非阻塞套接字
【发布时间】:2013-04-07 11:21:51
【问题描述】:

我正在用 C++ 编写客户端,客户端在两个不同的端口上获得响应。 我正在侦听主线程中的一个端口,同时我创建了其他线程(基于 posix),如下所示:

void *receiveFunc(void *ptr)
{
    try {
        while ( true ) {
            svr_sock << svr_data;
            cout<<svr_data<<endl;
        }
    } catch ( SocketException& ) {}
}

但是当它进入这个线程时,它永远不会出来,直到我在套接字上收到一些东西。

我该如何克服这个问题?

【问题讨论】:

  • 因为套接字是阻塞的?如何使其成为非阻塞取决于您的系统。
  • 我现在正在使用 linux,我尝试了不同的方法但没有工作:(.
  • 查看this old question中的代码。这就是在所有现代 POSIX 系统(包括 Linux 和 Mac OSX)上创建非阻塞套接字的方法。

标签: c++ sockets pthreads posix


【解决方案1】:

您的套接字处于阻塞模式。

这取决于您使用的操作系统如何将套接字设置为非阻塞模式。

Linux:您需要将套接字设置为非阻塞模式,如Beej's guide 中所述。

Windows:您必须使用winsock WinAPI 函数。

【讨论】:

  • @JoachimPileborg 是的,我已经阅读了有关超时的信息,我尝试了超时但无法正确执行。你有什么主意吗?谢谢
  • @Nevermore 'Couldn't do it wrong' 不是问题描述。
  • 您的第一个链接现在已失效。新链接是beej.us/guide/bgnet/html/#blocking
【解决方案2】:

为什么需要它“出来”?

无论如何,说服这样一个阻塞线程退出的常用方法是设置一些“终止”布尔值,以便 while 循环检查然后关闭套接字。这会导致套接字读取提前返回并出现错误。

【讨论】:

    【解决方案3】:

    除了上面的答案,beej 指南的新链接是: https://beej.us/guide/bgnet/html/#blocking

    【讨论】:

    • 您好,用户 2572309。您的条目更像是评论而不是答案。请考虑在评论部分添加它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多