Невозможно отправить данные с клиента Zeromq на TCP-сервер - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь использовать сокет zeromq в качестве необработанного сокета клиента TCP в C ++.У меня есть 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)

1 Ответ

0 голосов
/ 05 февраля 2019

Когда вы отправляете или получаете что-либо в сокете типа 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 более подробно рассказывается о том, как вы будете получать уведомления и контролировать соединения, отключения и т. Д.

...