我一直在开发一个使用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);
Run Code Online (Sandbox Code Playgroud)
按照Jakob的建议添加跟踪后,我得到以下输出
Assertion failed: Connection refused (..\..\..\src\signaler.cpp:310)
Run Code Online (Sandbox Code Playgroud)
任何想法这意味着什么?
编辑 我还应该提到这个问题不会发生在所有的XP机器上,只有一些.我一直试图弄清楚工作的机器与不工作的机器之间的区别.如果不知道这一点,那么升级和发布到生产环境中的风险太大了.
查看您提供的示例,您正在绑定到REQ套接字(请求,即客户端套接字),并且还使用通配符绑定 REQ 套接字。我不确定这会如何发展,但对我来说这没有意义。我认为这不受支持,但我找不到或记得任何有关绑定到 REQ 套接字的文档。很可能会发生奇怪的事情。
REP (响应)套接字是 REQ/REP 设置(请求/响应)的“服务器”端,您可以在服务器端使用 REP 套接字连接到端点,或者显式指定“tcp://127.0.0.1:5555 ”bind ”或使用通配符,例如“所有接口”、“tcp://*:5555”。然后,客户端将connect使用 REQ 套接字连接到显式端点地址“tcp://127.0.0.1:5555”,无通配符。
服务器会这样做:
ZmqContext context = ZmqContext.Create();
ZmqSocket socket = context.CreateSocket(SocketType.REP);
socket.Bind("tcp://*:5501");
Run Code Online (Sandbox Code Playgroud)
客户是这样的:
ZmqContext context = ZmqContext.Create();
ZmqSocket socket = context.CreateSocket(SocketType.REQ);
socket.Connect("tcp://127.0.0.1:5501");
Run Code Online (Sandbox Code Playgroud)
除了这些问题之外,您还应该确保防火墙没有阻止并确保端口尚未被使用(例如使用 NETSTAT 命令)。
对于 ZeroMq 寻址规则,请参阅zmq_tcp API 文档,对于套接字,请参阅zmq_socket API 文档。