首页 > 解决方案 > 无法将数据从 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)

标签: c++visual-studio-2013tcpzeromq

解决方案


当您在类型套接字上发送或接收任何内容时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 上的文档更详细地介绍了如何通知您并控制连接、断开连接等。


推荐阅读