没有多线程的 C++ 套接字非同步/并行代码

Posted

技术标签:

【中文标题】没有多线程的 C++ 套接字非同步/并行代码【英文标题】:C++ Sockets Unsynched/Parallel Code without Multithreading 【发布时间】:2016-11-01 14:37:09 【问题描述】:

我有这个用 c++ 编写的 2 端(客户端和服务器)程序,它基本上是一个“聊天程序”。

所以一侧向另一侧发送数据,另一侧向另一侧发送数据。 我正在使用 C-Sockets (TCP/SOCK_STREAM)。

所以我的问题是,根据我的经验,当服务器正在等待数据(“recv()”)时,它本身无法发送数据,因为 recv 队列是无限的。

我想了两种方法来解决这个问题,但我不确定它是否值得花时间。因为可能有一个简单的解决方案,我也太笨了。

    使它成为一个 6 面连接,这意味着我有一个“物理服务器”,我的服务器在四个实例中运行,每个客户端两次(发送和接收)。因此,如果一个服务器接收到数据,它将数据存储在一个文件中,以便另一个客户端的发送服务器读取并发送它。反过来也一样。

由于这个解决方案听起来很糟糕,我可能不会接受。

    使用多线程。就像我听说纯癌症一样,你不应该使用它,除非你必须这样做。

所以我的问题是,我必须这样做吗?还是有一个简单的解决方案?

【问题讨论】:

【参考方案1】:

recv() 在需要等待传入数据并且在数据到达之前无事可做时使用阻塞套接字。如果不是您的情况,您可以使用 non-blocking socket 或 select 超时。 select 会更简单,只需检查是否有任何东西定期到达您的套接字(例如在循环中),然后在其间做您想做的事情。

顺便说一下,它叫做“BSD socket”,而不是“C socket”,这可以帮助你搜索。

【讨论】:

考虑在支持它的平台上使用epoll() 而不是select() @RemyLebeau:你是对的。实际上,我不(直接)使用它们中的任何一个,而是更喜欢像 Boost.Asio 这样的跨平台高级解决方案

以上是关于没有多线程的 C++ 套接字非同步/并行代码的主要内容,如果未能解决你的问题,请参考以下文章

并发 并行 同步 异步 多线程 阻塞 非阻塞的区别

012-多线程-基础-非阻塞算法相关技术简介

c++多线程编程:实现标准库accumulate函数的并行计算版本

java 多线程怎么深入?

Linux socket使用多线程发送

并发 并行 同步 异步 多线程的区别