c# - 通过 C# 的 ZMQ - clrzmq 绑定(bind) Windows XP 失败但在 Win7 上正常

标签 c# zeromq

我一直在开发一个使用 ZMQ (2.2) 作为主要通信层的平台。本周早些时候,我决定采纳 zeromq 网站上的建议并升级到最新的稳定版本 3.2.2

然而,在经历了更新到新 API 的痛苦之后,我非常失望地发现 clrzmq 绑定(bind)似乎存在问题,因为它无法在 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 机器上,只是其中的一些。我一直在努力弄清楚能工作的机器和不能工作的机器之间有什么区别。如果不知道这一点,升级并发布到生产环境中风险太大。

最佳答案

查看您提供的示例,您正在绑定(bind)到 REQ 套接字(请求,即客户端套接字),并且还使用通配符绑定(bind) REQ 套接字。我不确定这将如何进行,但对我来说这没有意义。我认为这不受支持,但我找不到或不记得任何有关绑定(bind)到 REQ 套接字的文档。可能会发生奇怪的事情。

REP(响应)套接字是 REQ/REP 设置(请求/响应)的“服务器”端,您可以在其中使用 REPbind 服务器端套接字到端点,明确指定“tcp://127.0.0.1:5555”或使用通配符,例如“所有接口(interface)”,“tcp://*:5555”。然后,客户端将使用 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 .

关于c# - 通过 C# 的 ZMQ - clrzmq 绑定(bind) Windows XP 失败但在 Win7 上正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731167/

相关文章:

python-3.x - Python 3.6 ZeroMQ (PyZMQ) asyncio pub sub Hello World

zeromq - 如何让 zeromq PUB/SUB 丢弃旧消息而不是新消息(对于实时提要)?

c# - 在浏览器中打开 URL 并更改应用程序 View - Android Xamarin

c# - 如果 href 为空则隐藏 li 元素

c# - 使用 LINQ 和 vars 时如何避免方法长度蠕变

c - 为什么即使没有服务器监听,ZeroMQ 连接也返回 0?

C# 不重复的不可变和可变类型

c# - 为什么我的类型没有标记为相等?

带有 ZeroMQ + Socket.io + 每个客户端范围的 Node.js

javascript - 为什么我的请求和响应消息不按顺序排列?