在 ZeroMQ 中绑定订阅者套接字并连接发布者套接字会在代码运行时给出错误.为什么
Binding a subscriber socket and connecting a publisher socket in ZeroMQ is giving error when the code is run. Why?
在此代码中,订阅者(在subscriber.cpp
代码中(套接字绑定到端口5556。
它从发布者(subscriber.cpp
(接收更新/消息,发布者套接字连接到 5556 的订阅者并向其发送更新/消息。
我知道惯例是.bind()
出版商,而不是要求.connect()
。但从理论上讲,每种插座类型都可以 .bind()
或.connect()
.
但是,这两个代码在运行时都会给出 zmq 错误。为什么?
这是CPP代码。
publisher.cpp
#include <iostream>
#include <zmq.hpp>
#include <zhelpers.hpp>
using namespace std;
int main () {
zmq::context_t context (1);
zmq::socket_t publisher(context, ZMQ_PUB);
publisher.connect("tcp://*:5556");
while (1) {
zmq::message_t request (12);
memcpy (request.data (), "Pub-1 Data", 12);
sleep(1);
publisher.send (request);
}
return 0;
}
subcriber.cpp
#include <iostream>
#include <zmq.hpp>
int main (int argc, char *argv[])
{
zmq::context_t context (1);
zmq::socket_t subscriber (context, ZMQ_SUB);
subscriber.bind("tcp://localhost:5556");
subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0); // subscribe to all messages
// Process 10 updates
int update_nbr;
for (update_nbr = 0; update_nbr < 10 ; update_nbr++) {
zmq::message_t update;
subscriber.recv (&update);
std::string updt = std::string(static_cast<char*>(update.data()), update.size());
std::cout << "Received Update/Messages/TaskList " << update_nbr <<" : "<< updt << std::endl;
}
return 0;
}
不,反转.bind()/.connect()
没有问题
这基本上工作正常。
然而,PUB/SUB
正式原型受到所谓的晚加入综合症的影响。
如果没有如上所述的彻底调试细节,人们可能只是重复一般的经验法则:
在较新的 API 版本中,可以
添加rc = <aSocket>.setsockopt( ZMQ_CONFLATE, 1 ); assert( rc & "CONFLATE" );
添加rc = <aSocket>.setsockopt( ZMQ_IMMEDIATE, 1 ); assert( rc & "IMMEDIATE" );
等等,
所有这些都是为了更好地调整上下文实例 + 套接字实例属性,从而最大限度地减少后期加入综合征的影响。
反向 bind((/connect(( 没有问题。当我更改行时,代码正在工作 - 订阅者.bind("tcp://localhost:5556"(;自subscriber.bind(">tcp://:5556"(;和publisher.connect("tcp://:5556"(;自publisher.connect("tcp://localhost:5556"(;
- 一个非常简单的win32套接字代码,但工作错误
- boost::asio-async_read_some示例代码没有读取套接字中的所有数据
- 调试套接字 c++ 代码并帮助我理解
- 发送和十六进制消息时套接字代码C++问题
- 当我使用套接字代码发送第二条消息时,我有一个"sendto() Invalid argument"
- 在 ZeroMQ 中绑定订阅者套接字并连接发布者套接字会在代码运行时给出错误.为什么
- 为什么从我的代码中removig textbox.appendtext()在此处更改套接字通信
- 根据C++代码在 PHP 中创建字节数据并将其传递给套接字
- Windows 套接字编程 - 错误代码 0
- 使用 CAsynSocket,如何捕获套接字操作的退出代码?
- 如何将C++套接字编程代码转换为C#
- 当服务器重新启动并且客户端收到WSAECONNRESET错误代码时,我应该重新创建整个套接字吗
- 创建一个原始套接字 - Debian + 代码块
- 编译使用 libcxx 的套接字函数 bind() 的代码失败
- 是什么导致了我在套接字代码上的编译错误,以及我如何修复它
- C++套接字编程:sendto()和recvfrom()错误代码10038和in 'server'绑定失败,10038
- 没有多线程的c++套接字不同步/并行代码
- 无法通过windows UDP套接字发送数据:错误代码10035
- 简单UDP套接字代码,发送和接收消息
- 带超时的多线程面向对象套接字代码