【发布时间】:2018-01-15 03:02:25
【问题描述】:
我正在尝试通过 czmqz (4.0.2) 使用 libzmq (4.2.2) 在 Python 程序和我的 C++ 应用程序之间建立 IPC 通信通道。
我正在使用 ZMQ 发布者/订阅者模式,其中 Python 程序绑定到端口并使用 pyzmq (16.0.2) 发布消息,而我的 C++ 程序使用来自 CZMQ 的 zsock class 作为订阅者进行连接。
问题是,每当我的订阅者尝试连接时,我都会返回错误代码 11,资源暂时不可用。奇怪的是,这个系统似乎在我的开发机器上工作得很好,但在我要部署到的目标系统上却不行。
问题出现在以下简略方法初始化套接字的第一行:
bool ZmqSocketWrapper::connectSubscriber(string address)
{
m_address = address;
m_pSocket = zsock_new_sub(address.c_str(), "");
int errorCode = zmq_errno();
if (errorCode != 0)
{
printf(zmq_strerror(errorCode));
return false;
}
return true;
}
这样调用:
m_subscriberSocket->connectSubscriber("tcp://127.0.0.1:5555");
我还尝试了其他变体,结果相同:
m_subscriberSocket->connectSubscriber("tcp://localhost:23232");
m_subscriberSocket->connectSubscriber("ipc:///tmp/test");
在线搜索时,似乎大多数其他人在尝试发送/接收时都会遇到这个问题,所以我在尝试打开套接字时遇到这个问题似乎很奇怪。
其他一些细节:
- 我的 ZMQ 发布器是使用 pyzmq 用 Python 编写的,并且在同一目标系统上运行良好,这表明问题出在 czmq 中。
- 我发现问题的机器是 Raspberry Pi,以防万一,但请记住以上几点。
- 不,没有其他任何东西在使用该端口,并且我已使用 netstat 确认服务器端口正在侦听。
- 是的,我已尝试以 root 身份运行我的客户端。
非常感谢任何帮助!
【问题讨论】:
-
我建议您在 strace 中运行您的应用程序,看看那里到底发生了什么故障。它可能会给你一些提示。
-
谢谢@SergeyA。我尝试在 Python 程序和 C++ 程序上都使用
strace -e trace=network,并让它们都做同样的事情(只需将套接字绑定到 tcp://*:5555)。 strace 输出的唯一区别是分配的文件描述符 ID。在 C++ 中我总是得到socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) = 27,而在Python中我总是得到socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) = 10。 -
在这两种情况下,以下
strace行是setsockopt(10, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0; bind(10, {sa_family=AF_INET, sin_port=htons(6666), sin_addr=inet_addr("0.0.0.0")}, 16) = 0; listen(10, 100) = 0; getsockname(10, {sa_family=AF_INET, sin_port=htons(6666), sin_addr=inet_addr("0.0.0.0")}, [16]) = 0;
标签: python c++ sockets ipc zeromq