c++ - 无法将数据从 Zeromq 客户端发送到 TCP 服务器
问题描述
我正在尝试使用 zeromq 套接字作为 C++ 中的原始 TCP 客户端套接字。我在另一个程序中有一个 TCP 服务器,我想向它发送数据。当我将我的 Zeromq 客户端连接到服务器时,我能够从服务器接收数据,但无法将数据发送到 TCP 服务器。发送时出现以下错误:未处理的错误,zmq::error_t 知道如何使它工作吗?
zmq::context_t *ctx = new zmq::context(100, 100);
void *raw_socket = new zmq::socket_t(*ctx, ZMQ_STREAM);
zmq::socket_t *socket = static_cast<zmq::socket_t*>(raw_socket);
socket->connect("tcp://127.0.0.1:5555");
char message[] = "HELLO, WORLD!"
socket->send(message, strlen(message), ZMQ_SNDMORE)
解决方案
当您在类型套接字上发送或接收任何内容时ZMQ_STREAM
,第一个数据帧应该是一个标识符,指示后续帧应该去哪里或它们来自哪里。
当使用ZMQ_STREAM
套接字作为服务器时(即您调用bind
套接字),您可以提取此身份框架recv
并在您响应时重新发送它。
当用作客户端(即调用connect
套接字)时,您需要从套接字获取身份,您可以通过getsockopt
使用ZMQ_IDENTITY
标志来执行此操作。
标识大小限制为最多 255 个字节。
// get the id after you've called connect
std::size_t id_size = 256;
char id[ 256 ];
socket->getsockopt( ZMQ_IDENTITY, &id, &id_size );
// send the id frame
socket->send(id, id_size, ZMQ_SNDMORE);
// then your data
char message[] = "HELLO, WORLD!";
socket->send(message, strlen(message), ZMQ_SNDMORE);
ZMQ_STREAM 上的文档更详细地介绍了如何通知您并控制连接、断开连接等。
推荐阅读
- ios - SpriteKit 帧周期中何时调用触摸事件?
- python - Python Pandas 中的 .loc 是否会对原始数据框进行就地更改?
- c - 不要通过不兼容类型的指针访问变量?
- c - 尝试从 CS50 制作 Cypher - 出现分段错误
- python - 我的 renpy 代码在工作标签上失败了,菜单坏了,所有的东西都死了
- filter - 过滤器上的粘性位置不起作用
- python - 如何在列表理解中使用 else 语句?
- c++ - Q:打印一个字符串的所有子序列,包括空字符串,递归实现,报错:expression:string subscript out of range
- c++ - is_copy_constructible typetrait 给出了错误的答案
- node.js - 第一次调用 api 时保存响应配置并进一步使用它