在一个线程中通过 tcp 套接字发送和接收数据
Send and receive data by tcp socket in one thread
>我有一个有 2 个线程的应用程序。第一个线程(主线程)和第二个线程(tcp-client-thread)。main-thread
生成一些消息并将其放入队列中以供tcp-client-thread
。 tcp-client-thread
必须将这些消息发送到服务器。但是,tcp-client-thread
还必须从服务器接收一些消息。
我该怎么做? recv
停止当前线程。设置recv
超时?那么在recv
超时检查队列(从main-thread
)之后,如果有消息发送,没有任何消息再次开始recv
?
您可以在一个非旋转/非延迟线程中进行 I/O,但它比简单地按照另一个答案中的建议创建另一个线程要复杂得多。 简而言之,您必须修改代码以同时处理等待多个事件类型,例如,套接字上的事件或发送数据的条件。 在Windows上,你会使用像WSAEventSelect + WaitForMultipleObjects这样的东西而不是select,而在Linux上,你会使用像eventfd这样的东西和select。 请注意,在处理套接字时,如果它阻塞,您需要在发出 recv 之前检查可读性,并在发出发送之前检查可写性,这样您就不会阻止其中一个。 就像我说的,创建一个发送线程更容易......
您需要的是非阻塞/异步 I/O。在尝试伪造任何代码之前,您应该阅读一些理论。例如,本文:http://www.wangafu.net/~nickm/libevent-book/01_intro.html
如果要使用 2 个线程,则可能需要扩展到 3 个线程。 让发送和接收函数位于不同的线程上。
发送线程处于休眠状态,直到主线程为其提供数据。 具体来说,send
软件单元中的函数将数据放入队列,然后向线程发出唤醒信号。 线程唤醒并发送数据,直到队列为空,然后返回睡眠状态。
相反,接收线程在接收数据之前处于休眠状态。 它将数据追加到另一个队列,通知主线程已收到数据并返回睡眠状态。
编辑1:一个线程
根据标题,如果要在一个线程中执行 I/O,则需要有一个轮询循环(可以有有限的等待时间,但不建议这样做)。
Loop:
if (data received) then place data into input queue.
if (data in input queue) process some data (use small chunks).
if (data in output queue) send some data.
end-loop.
这个想法是保持数据块较小,以防止丢失传入数据。 当没有数据时(并且经过多次迭代),可以处理和输出数据。 这将解决大多数同步问题。
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- ASIO 的 TCP 套接字::async_wait() 并在此之后关闭套接字
- Visual Studio(C++):如何使用TCP套接字发送多个值
- TCP套接字(客户端-服务器)recv()返回-1值
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- C++中TCP套接字的recv函数
- 通过 TCP 套接字发送大型 base64 字符串
- 提升 ASIO TCP 套接字 1.70 不向后兼容
- 尝试连接到 TCP 套接字 (Linux) 时连接被拒绝
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 如何知道请求是否完全使用 TCP 套接字接收?
- Qt TCP 套接字 - 写入超过 15 个字节
- 要打开以供C++中的应用程序最佳使用的并行套接字/TCP连接数
- C++ 如何通过套接字 (TCP) 进行二进制序列化
- 套接字 TCP 服务器程序问题
- Cpp套接字-TCP传输(使用同一端口发送,然后接收)