c ++中的非阻塞套接字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c ++中的非阻塞套接字相关的知识,希望对你有一定的参考价值。

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

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

但当它进入这个线程时,它永远不会出现,直到我收到了套接字上的东西。

我怎样才能克服这个问题?

答案

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

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

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

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

另一答案

为什么你需要它'出来'?

无论如何,说服这种被阻止的线程退出的通常方法是为while循环设置一些'terminate'bool以检查然后关闭套接字。这会导致套接字读取提前返回并出现错误。

以上是关于c ++中的非阻塞套接字的主要内容,如果未能解决你的问题,请参考以下文章

DLL 中的非阻塞套接字(无窗口)

在 C 中使用非阻塞套接字连接

C 中的共享内存代码片段

为啥C没有像javascript中的setTimeout这样的非阻塞睡眠功能

C 中的 Windows 套接字编程

如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数