2015-07-21 55 views
1

我目前正在进行一项需要通过网络进行通信的项目,并且正在使用ZMQ。该项目的主要目标是建立一个中央节点,为任何时候可以连接的客户提供服务。对于每个连接的客户端,中央节点应该产生相应的工作者线程并代理两者之间的通信。所有的通信都是通过tcp进行的。ZMQ经销商 - 路由器 - 经销商模式

客户端和工作人员需要随时发送和接收消息,因此他们是ZMQ_DEALER类型的套接字,中心节点是ZMQ_ROUTER

我有一个问题,一段时间后,中央节点(路由器和所有工人)中的所有线程都会死锁。在检查了所有ZMQ线程的堆栈后,它们全部被锁定在SockWaitForSingleObject的win上,而poll/epoll_wait在Linux上。

我已能重现问题http://pastebin.com/aUTg7RJY(它在引擎收录,因为它是相当长)

在这个例子中,客户端是在同一个进程中的工人和所有的预连接有点小例子,但在他们不是真实的情况,但这并没有什么区别 - 在这两种情况下,问题都是一样的。

我试图修改示例代码使用inproc协议为职工节点通信,但问题仍然存在http://pastebin.com/MJBHNyiF

我不知道是不是我的问题是与网络的架构或我滥用ZMQ库。我会感谢任何帮助!

回答

0

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

  • 怎么了永远阻止客户端? (while (1) { this_thread::sleep_for(milliseconds(1));}

  • 当使用DealerSocketRouterSocket通信您应该效仿的RequestSocketResponseSocket。在您的客户和工作人员中,您忘记在内容之前添加一个空框架,这意味着您不遵守zmq协议。

这些问题都不应该是您的问题,但不遵守zmq规则会产生奇怪的效果。

+0

我试图将其剥离到最低限度,这再现了为什么存在几个“丑陋”部分的问题。永远的阻塞只是为了让线程在调试过程中保持活跃状态​​。 我跳过所有空帧,因为网络的所有部分都是经销商/路由器,无论如何,即使我添加它们 - 没有任何变化。 感谢您查看此,但。 – posedion4o