【问题标题】:Unable to send data from Zeromq client to TCP server无法将数据从 Zeromq 客户端发送到 TCP 服务器
【发布时间】:2019-06-29 01:26:40
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

  • raw_socket需要什么?
  • 我连接的TCP服务器是使用python构建的TCP服务器,所以无法使用ZMTP协议连接。
  • 但在示例中它完全没用
  • 你是什么意思?
  • 您将指向zmq::socket_t 的指针分配给void*。然后,您唯一要做的就是将其转换回zmq::socket_t*。那是完全没用的。只需执行zmq::socket_t *socket = new zmq::socket_t(*ctx, ZMQ_STREAM);,您就可以达到相同的效果(加上节省一些内存)。我认为拥有raw_socket 毫无意义。

标签: c++ visual-studio-2013 tcp zeromq


【解决方案1】:

当您在 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 上的文档更详细地介绍了如何通知您以及控制连接、断开连接等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 2019-03-12
    • 2013-04-11
    • 2021-12-07
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    相关资源
    最近更新 更多