在不同的线程上发送和接收

send and recv on different threads

本文关键字:线程      更新时间:2023-10-16

我正在开发一个基本的配对服务器。基本过程如下:

  1. 客户端连接到服务器,报告客户端的名称和他们正在寻找的匹配类型
  2. 服务器报告所有可能的匹配
  3. 客户端选择他/她想要配对的匹配
  4. 服务器匹配两个客户端

问题是每次客户端连接时,我需要报告所有可能匹配的新客户端,并报告所有可能匹配的新连接客户端(因此,当不匹配的客户端必须始终准备好从服务器recv)。同时,客户端可以在任何时候选择一个匹配,或者断开连接(因此客户端必须始终准备好send,服务器必须准备好recv)

我怀疑这个问题的真正解决方案是使用线程,一个客户端和服务器的后台recv线程,一个主要的用户交互send线程。

我有两个问题:

  1. 是保存到sendrecv与相同的套接字连接同时在不同的线程?
  2. 这是正确的处理方法吗?

(标记为c++和obj-c,因为服务器是用c++构建的,客户端是obj-c)

是的,使用同一个套接字在一个线程上使用recv()和在另一个线程上使用send()是安全的。

服务器端,只有当有相对较少的客户端同时连接到服务器时,使用专用线程才能有效地工作。如果可伸缩性是一个问题,您需要使用异步I/O,甚至如果可能的话,使用I/O完成端口来管理单个线程上的多个客户机,将所需的线程数量保持在最低限度。

在任何合理的套接字库实现中都是安全的。这也是正确的做法。