ZeroMQ Radio / Di sh не принимает сообщения - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь заставить работать шаблон Radio / Di sh в ZeroMQ (libzmq с простым C). В конечном итоге я хочу использовать UDP многоадресную рассылку, но даже не могу заставить работать одноадресную рассылку TCP. Следующий минимальный пример не работает для меня. Я попробовал пример Pub / Sub из официального руководства и могу подтвердить, что обычно ZeroMQ over TCP работает на моей машине, но не Radio / Di sh. Чего мне не хватает?

Радио:

#define ZMQ_BUILD_DRAFT_API

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <zmq.h>

int main(int argc, char *argv[]) {
    if (argc < 3) {
        printf("Please provide topic and message.");
        return EXIT_FAILURE;
    }

    void *context = zmq_ctx_new();
    void *radio = zmq_socket(context, ZMQ_RADIO);
    if (zmq_connect(radio, "tcp://127.0.0.1:5556") != 0) {
        printf("Failed to connect sending socket.");
        return EXIT_FAILURE;
    }

    zmq_msg_t msg;
    if (zmq_msg_init_data(&msg, argv[2], strlen(argv[2]), NULL, NULL) != 0) {
        printf("Failed to init message for topic %s.", argv[1]);
        return EXIT_FAILURE;
    }
    if (zmq_msg_set_group(&msg, argv[1]) != 0) {
        printf("Failed to set topic %s.", argv[1]);
        return EXIT_FAILURE;
    }
    if (zmq_msg_send(&msg, radio, 0) == -1) {
        zmq_msg_close(&msg);
        printf("Failed to send message \"%s\" on topic %s.", argv[2], argv[1]);
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

Di sh:

#define ZMQ_BUILD_DRAFT_API

#include <stdlib.h>
#include <stdio.h>
#include <zmq.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Please provide a topic.");
        return EXIT_FAILURE;
    }

    void *context = zmq_ctx_new();
    void *dish = zmq_socket(context, ZMQ_DISH);
    if (zmq_bind(dish, "tcp://*:5556") != 0) {
        printf("Failed to bind listen socket.");
        return EXIT_FAILURE;
    }

    if (zmq_join(dish, argv[1]) != 0) {
        printf("Could not subscribe to %s.", argv[1]);
        return EXIT_FAILURE;
    }

    int bytesReceived;
    zmq_msg_t receiveMessage;

    zmq_msg_init(&receiveMessage);
    bytesReceived = zmq_msg_recv(&receiveMessage, dish, 0);
    if (bytesReceived == -1) {
        printf("Failed to receive message.");
    } else {
        printf("topic: %s, data: %s, size: %d", zmq_msg_group(&receiveMessage), (char *)zmq_msg_data(&receiveMessage), bytesReceived);
    }

    zmq_msg_close(&receiveMessage);

    return EXIT_SUCCESS;
}

Запуск:

dish.exe TV
radio.exe TV test_msg

Ди sh, кажется, слушает, и радио делает свое дело без ошибок, но ди sh никогда ничего не получает. Оба исполняемых файла запускаются на одной машине. Заранее спасибо.

1 Ответ

0 голосов
/ 16 марта 2020

Так что я понял это сам. Проблема в радио / издателе. Программа не должна заканчиваться сразу после zmq_msg_send, иначе сообщение не будет отправлено. Я добавил zmq_ctx_destroy(context) перед возвращением, и это решило проблему. Согласно документации zmq_ctx_destroy(context) ожидает отправки ожидающих сообщений, прежде чем завершить работу. Кажется, это было проблемой.

...