C++ ZMQ经销商路由器经销商模式
我目前正在从事一个需要通过网络进行通信的项目,我正在使用ZMQ。该项目的主要目标是拥有一个中心节点,为随时可以连接的客户机提供服务。对于每个连接的客户机,中心节点都应该产生一个对应的工作线程,并代理两者之间的通信。所有通信都是通过tcp进行的 客户机和工作人员需要随时发送和接收消息,因此他们是C++ ZMQ经销商路由器经销商模式,c++,multithreading,zeromq,C++,Multithreading,Zeromq,我目前正在从事一个需要通过网络进行通信的项目,我正在使用ZMQ。该项目的主要目标是拥有一个中心节点,为随时可以连接的客户机提供服务。对于每个连接的客户机,中心节点都应该产生一个对应的工作线程,并代理两者之间的通信。所有通信都是通过tcp进行的 客户机和工作人员需要随时发送和接收消息,因此他们是ZMQ\u经销商类型的套接字,而中心节点是ZMQ\u路由器 我有一个问题,在一段时间后,中心节点中的所有线程(路由器和所有工作线程)都将死锁。在检查所有ZMQ线程的堆栈后,它们都在win上的SockWait
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
。在客户机和worker中,您忘记在内容之前添加空帧,这意味着您不遵守zmq协议响应Socket
这些问题实际上都不是你的问题,但不遵守zmq规则可能会产生奇怪的效果。我试图将其剥离到再现问题的最低限度,这就是为什么有几个“丑陋”的部分。永久阻塞只是为了使线程保持活动状态,以便在调试中进行检查。我跳过了所有的空帧,因为网络的所有部分都是经销商/路由器,不管怎样,即使我添加了它们,也没有任何变化。谢谢你调查这件事。