我刚刚在Unbutu Precise(12.04)系统上下载并安装了zeromq-4.0.5。我已经编译了用C语言编写的hello-world client(REQ
,connect,127.0.0.1)和server(REP
,bind)。
zmq_recv
调用仍然被卡住。为客户端取得进展的唯一方法是杀死它(使用Ctrl-CQ1:这是预期的行为吗?
Q2:我应该在示例代码中进行哪些更改以解决此问题?
Q3:我使用的软件版本错误,或者系统上有问题吗?
我已禁用防火墙,sudo iptables -S
打印-P INPUT ACCEPT
; -P FORWARD ACCEPT
; -P OUTPUT ACCEPT
。
在strace -f ./hwclient
输出中,我可以看到服务器关闭后,客户端正在每秒尝试10次connect()
(ZMQ_RECONNECT_IVL
的默认值)。在strace -f ./hwserver
输出上,我可以看到重新启动的服务器accept()
建立了连接。但是,此后通信陷入僵局,服务器从不接收来自客户端的实际请求(但它会通知我何时杀死客户端;服务器还会从服务器重启后启动的其他客户端接收请求。)
使用ipc://
代替tcp://
会导致相同的行为。
如果服务器在客户端执行下一个zmq_send
之前已被终止,则自动重新连接会成功在zmq_send
中进行。但是,如果在客户端运行zmq_recv
时服务器被杀死,则zmq_recv
会无限期阻塞,并且客户端似乎无法从中恢复。
我发现this article,建议使用超时。但是,我认为超时不是正确的解决方案,因为TCP断开连接通知已在客户端进程中提供,并且已经在起作用,它不会使zmq_recv
将请求重新发送给新的服务器-或至少提前返回以指示错误。
我刚刚在Unbutu Precise(12.04)系统上下载并安装了zeromq-4.0.5。我已经编译了用C语言编写的hello-world客户端(REQ,connect,127.0.0.1)和服务器(REP,bind)。我启动...
您可能会遇到zemomq在4.0.6(issue 1362)中刚刚为我解决的问题。基本上,订户套接字不一定会在重新连接期间总是重新发送其过滤器(空的过滤器意味着没有发布者到该订户的消息)。恢复的唯一方法是重新启动客户端的应用程序。他们的修复工作似乎已经完成。当使用传输器(例如stunnel)来建立连接的隧道时,确实突出显示了该问题。如果没有4.0.6,我可以通过在订户套接字上设置“立即”标志来解决此问题。