在接收另一个线程的套接字上触发EAGAIN
Trigger an EAGAIN on a socket receiving on another thread
假设我有两个线程,主线程和一个专门用于持续侦听标准TCP套接字的线程。现在,假设在某个时刻我想关闭所有东西。在主线程中,我想关闭监听线程正在处理的连接,然后加入线程并结束程序。
然而,这很棘手,因为我不知道如何使侦听线程从对read
的调用返回。该调用将不会返回,除非实际接收到某些内容,并且原则上我可能会等待很长很长时间,直到另一个端点决定向我发送一些内容。
当我使用UDP套接字时,我曾经通过从我的环回接口在该端口上发送数据包来解决这个问题,因此触发recvfrom
的返回。然而,这是非常不优雅的,它不能在TCP套接字上完成。
我知道另一种解决方法是使用setsockopt
设置超时:这样我就可以保证调用最终会返回,但这也不美观,而且效率很低,因为我可能要等待几秒钟才能加入线程。
所以我想知道是否有某种方法可以触发EAGAIN
在套接字read
调用上,不像我要超时的那个,这样在我的主线程上,我可以在我的套接字描述符上调用一些force_return
,在另一个线程上调用read
会返回?
我通常通过创建pipe
()并在读取线程中使用select()
来解决这个问题。读线程必须在TCP套接字和管道的一端同时选择。当你想关闭读取器时,设置一个标志并向管道的另一端写入一些数据。
设置:
#include <unistd.h>
int signalPipe[2];
...
pipe(signalPipe);
读者:
while(running)
{
FD_ZERO(&fds);
FD_SET(tcpSocket, &fds);
FD_SET(signalPipe[0], &fds);
select(max(tcpSocket, signalPipe[0]) + 1, &fds, NULL, NULL, NULL);
...
}
其他线程:
// We want to stop now.
running = false;
write(signalPipe[1], "foo", 3);
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- EAGAIN 在 zeromq REQ/REP 上收到,没有阻塞套接字
- 阅读套接字: EAGAIN:资源暂时不可用
- 在接收另一个线程的套接字上触发EAGAIN