我正在用 C++ 编写一个分叉聊天服务器,每个传入的客户端都是它自己的进程。服务器-客户端交互是通过使用处理消息队列和 IPC 的 ZeroMQ 套接字的普通套接字完成的。基本问题是,当服务器分叉以适应新客户端时,客户端的进程具有上下文的副本(这就是 fork 所做的,对吗?),因此当它将套接字与上下文绑定时,其他客户端都没有知道套接字。长话短说:如何让每个客户端线程具有相同的上下文,以便它们可以通过 ZeroMQ 相互交谈?
我已经研究了在进程之间共享上下文的各种方法,到目前为止,我只找到了这个。问题在于 1)它使用了一个线程池,据我从那里写的内容来看,只创建了 5 个线程;该服务器需要支持至少 256 个,因此至少有那么多线程,并且 2)它使用 ZeroMQ 来与客户端通信和后端任务;我仅限于将 ZeroMQ 用于后端。
我查看了 ZeroMQ 邮件列表,其中一条消息说 fork() 与 ZeroMQ 的工作方式是正交的。这是否意味着我不能在分叉的子进程之间共享我的上下文?如果是这种情况,我如何在多个进程之间共享上下文,同时牢记支持至少 256 个客户端并仅将 ZeroMQ 用于后端的要求?
编辑:清除线程/进程混淆。对于那个很抱歉。
EDIT2:我也喜欢分叉而不是线程的原因是我习惯于有一个主进程接受传入的套接字连接然后分叉,将新的套接字提供给子进程。我不知道如何以线程方式做到这一点(不是很好实践,但不是完全超出我的范围)
EDIT3:所以,开始用线程重写它。我想这是唯一的方法吗?
EDIT4:为了进一步澄清,到服务器的传入连接可以是 TCP 或 UDP,当客户端连接时我必须处理它是哪种类型,所以我不能使用 ZeroMQ 套接字来监听。