发送和recv在不同的线程上

时间:2013-04-10 15:42:54

标签: c++ objective-c sockets

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

  1. 客户端连接到服务器,报告客户端的名称以及他们要查找的匹配类型
  2. 服务器报告所有可能的匹配
  3. 客户选择他/她希望与哪个匹配
  4. 服务器匹配两个客户端
  5. 问题在于,每次客户端连接时,我都需要向所有可能的匹配报告此新客户端,并向该新连接客户端报告所有可能的匹配(因此,无法匹配的客户端必须始终准备好{{1}来自服务器)。同时,客户端可以在任何时候选择匹配或断开连接(因此客户端必须始终准备好recv并且服务器必须准备好send

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

    所以我有两个与此相关的问题:

    1. 在不同的线程上同时使用相同的套接字连接保存到sendsend吗?
    2. 这是处理这个问题的正确方法吗?
    3. (标记为C ++和obj-c,因为服务器是用C ++构建的,客户端是obj-c)

2 个答案:

答案 0 :(得分:2)

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

服务器端,使用专用线程只有在同时连接到服务器的客户端相对较少的情况下才能有效工作。如果可伸缩性是一个问题,则需要使用异步I / O,甚至是I / O完成端口(如果可能),以在单个线程上管理多个客户端,从而将所需线程的数量降至最低。

答案 1 :(得分:1)

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