我有一个简单的代码块,它建立一个 ZMQ_PUB 类型套接字来广播数据包。然而,我发现这段代码可以在某些 Windows 机器上运行,而不能在其他机器上运行。
工作机器详细信息:ZMQ版本4.3.5,Windows 11。 不工作的机器详细信息:ZMQ 版本 4.3.5,Windows 10。
#include <string>
#include <iostream>
#include <zmq.h>
this->publisher_context = zmq_ctx_new();
this->publisher_socket = zmq_socket(this->publisher_context, ZMQ_PUB);
assert(this->publisher_socket);
std::string address = "tcp://localhost:5556";
int broadcastConnect = zmq_bind(this->publisher_socket, address.c_str());
if (broadcastConnect != 0) {
int error_code = zmq_errno();
std::string text = "Broadcast socket did not connect correctly. ZMQ error code: " + std::to_string(error_code);
std::cout << text.c_str() << std::endl;
}
此代码抛出 ZMQ 错误 19 (ENODEV)。
我在不工作的机器上尝试过的事情:
netstat
通过 cmd 检查我打开的 TCP 端口使用情况(端口未使用)localhost
配置正确。此外,将地址字符串中的 localhost
替换为 [::1]
会产生相同的结果。接下来我要尝试的事情:
事实证明,要么该端口被秘密使用(但 netstat 未报告),要么该端口对与其交互的套接字类型有限制。将端口号从 5556 更改为 5570 解决了我的问题。但我不知道这个端口被封锁的根本原因是什么。