C++ ZMQ经销商路由器经销商模式

C++ ZMQ经销商路由器经销商模式,c++,multithreading,zeromq,C++,Multithreading,Zeromq,我目前正在从事一个需要通过网络进行通信的项目,我正在使用ZMQ。该项目的主要目标是拥有一个中心节点,为随时可以连接的客户机提供服务。对于每个连接的客户机,中心节点都应该产生一个对应的工作线程,并代理两者之间的通信。所有通信都是通过tcp进行的 客户机和工作人员需要随时发送和接收消息,因此他们是ZMQ\u经销商类型的套接字,而中心节点是ZMQ\u路由器 我有一个问题,在一段时间后,中心节点中的所有线程(路由器和所有工作线程)都将死锁。在检查所有ZMQ线程的堆栈后,它们都在win上的SockWait

我目前正在从事一个需要通过网络进行通信的项目,我正在使用ZMQ。该项目的主要目标是拥有一个中心节点,为随时可以连接的客户机提供服务。对于每个连接的客户机,中心节点都应该产生一个对应的工作线程,并代理两者之间的通信。所有通信都是通过tcp进行的

客户机和工作人员需要随时发送和接收消息,因此他们是
ZMQ\u经销商
类型的套接字,而中心节点是
ZMQ\u路由器

我有一个问题,在一段时间后,中心节点中的所有线程(路由器和所有工作线程)都将死锁。在检查所有ZMQ线程的堆栈后,它们都在win上的
SockWaitForSingleObject
和linux上的
poll
/
epoll\u wait
上被阻止

我已经做了一些最小的例子来重现这个问题(它在pastebin中,因为它相当长)

在本例中,客户端与工作者处于相同的过程中,并且所有客户端都是预连接的,但在实际情况中,它们不是预连接的,但这没有任何区别——在这两种情况下,问题是相同的

我试图修改示例代码以使用
inproc
协议进行工作节点通信,但问题仍然存在


我不知道我的问题是网络的架构还是我误用了ZMQ库。我将感谢任何帮助

这是一个相当复杂的例子,但有几个问题需要提及:

  • 永远封锁客户机是怎么回事? (
    while(1){this_thread::sleep_for(毫秒(1));}

  • 使用
    DealerSocket
    RouterSocket
    通信时,您应该模拟
    RequestSocket
    响应Socket
    。在客户机和worker中,您忘记在内容之前添加空帧,这意味着您不遵守zmq协议


这些问题实际上都不是你的问题,但不遵守zmq规则可能会产生奇怪的效果。

我试图将其剥离到再现问题的最低限度,这就是为什么有几个“丑陋”的部分。永久阻塞只是为了使线程保持活动状态,以便在调试中进行检查。我跳过了所有的空帧,因为网络的所有部分都是经销商/路由器,不管怎样,即使我添加了它们,也没有任何变化。谢谢你调查这件事。