我一直在开发一个使用ZMQ(2.2)作为主要通信层的平台。本周早些时候,我决定接受zeromq网站上的建议并升级到最新的稳定版本3.2.2
然而,在经历了更新到新API的痛苦之后,我发现clrzmq绑定似乎存在问题,因为它无法在Windows XP(SP3)计算机上加载libzmq库,我感到非常失望。我一直收到SEHException异常?!
我只是想知道是否有人有同样的问题,是否有解决方法(甚至更好的解决方案)呢?
干杯 :)
修改 只是为了澄清一下,这个库加载得很好,我知道这是因为创建的上下文没有任何问题。在上下文中调用CreateSocket方法时会出现问题...请参阅下面的代码段
ZmqContext context = ZmqContext.Create();
ZmqSocket socket = context.CreateSocket(SocketType.REQ);
按照Jakob的建议添加跟踪后,我得到以下输出
Assertion failed: Connection refused (..\..\..\src\signaler.cpp:310)
任何想法意味着什么?
修改 我还要提一下,这个问题不会在所有XP机器上发生,只有部分。我一直试图弄清楚工作的机器与不工作的机器之间的区别。如果不知道这一点,那么升级和发布到生产环境中的风险太大了。
答案 0 :(得分:1)
查看您提供的示例,您绑定到 REQ 套接字(请求,即客户端套接字),并使用通配符绑定REQ套接字。我不确定这会如何发挥,但对我来说这没有意义。我不认为这是支持的,但我找不到或记住有关绑定到REQ套接字的任何文档。可能会发生奇怪的事情。
REP (响应)套接字是REQ / REP设置(请求/响应)的“服务器”端,其中bind
服务器端使用REP套接字到端点,显式指定“tcp://127.0.0.1:5555”或使用通配符,例如“所有接口”,“tcp:// *:5555”。然后客户端connect
使用REQ套接字到显式端点地址“tcp://127.0.0.1:5555”,没有通配符。
服务器会执行此操作:
ZmqContext context = ZmqContext.Create();
ZmqSocket socket = context.CreateSocket(SocketType.REP);
socket.Bind("tcp://*:5501");
客户端:
ZmqContext context = ZmqContext.Create();
ZmqSocket socket = context.CreateSocket(SocketType.REQ);
socket.Connect("tcp://127.0.0.1:5501");
除了这些问题之外,您还应该确保防火墙没有阻塞,并确保端口尚未使用(例如使用NETSTAT命令)。
对于ZeroMq寻址规则,请参阅zmq_tcp API documentation,对于套接字,请参阅zmq_socket API documentation。