EPGM ZeroMQ не работает в погоде PUB-SUB demo

Я скомпилировал libzmq с openpgm без изменений под Windows. Код здесь взят из Руководства ZeroMQ (сервер / клиент "Weather Publishing "). Но если я изменил "tcp" на "epgm", он больше не работает (данные не получены, но соединение установлено).

void test_serv()
{    
    //  Prepare our context and publisher
    void *context = zmq_ctx_new();
    void *publisher = zmq_socket(context, ZMQ_PUB);
    int rc = zmq_bind(publisher, "epgm://127.0.0.1:5556");
    assert(rc == 0);

    //  Initialize random number generator
    srandom((unsigned)time(NULL));
    while (!stop_server)
    {
        //  Get values that will fool the boss
        int zipcode, temperature, relhumidity;
        zipcode = randof(1000) + 600;
        temperature = randof(215) - 80;
        relhumidity = randof(50) + 10;

        //  Send message to all subscribers
        char update[20];
        sprintf(update, "%d %d %d", zipcode, temperature, relhumidity);
        s_send(publisher, update);
    }
    LOG("END Server shutdown");
    Sleep(500);
    zmq_close(publisher);
    zmq_ctx_destroy(context);
}

void test_sock()
{    
    //  Socket to talk to server
    LOG("Collecting updates from weather server...");
    void *context = zmq_ctx_new();
    void *subscriber = zmq_socket(context, ZMQ_SUB);
    int rc = zmq_connect(subscriber, "epgm://127.0.0.1:5556");
    assert(rc == 0);

    //  Subscribe to zipcode, default is NYC, 10001
    char *filter = "1001 ";
    rc = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE,
        filter, strlen(filter));
    assert(rc == 0);

    //  Process 100 updates
    int update_nbr;
    long total_temp = 0;
    for (update_nbr = 0; update_nbr < 10; update_nbr++) {
        char *string = s_recv(subscriber);

        int zipcode, temperature, relhumidity;
        sscanf(string, "%d %d %d",
            &zipcode, &temperature, &relhumidity);
        total_temp += temperature;
        LOG(">> " << string);
        free(string);
    }
    LOG("Average temperature for zipcode "<< filter << "was " << (int)(total_temp / update_nbr) << 'F');

    zmq_close(subscriber);
    zmq_ctx_destroy(context);
}

Я запускаю две функции в разных потоках, с tcp все работает как положено.

Я попытался сделать "route print 0.0.0.0" с cmd.exe и использовать IP-интерфейс (192.168.137.64) в качестве префикса вместо "eth0", как показано в RFC: epgm://192.168.137.64;127.0.0.1:5556 on подключиться и / или связать, но это ломает мой сокет и вызывает ошибку.

Также "PGM" требует прав администратора, и я не могу проверить это сейчас.

Ошибка НЕ ​​"протокол не поддерживается", errno установлен в B (11), и я не понимаю, что это значит (нет документов на него).

2 ответа

Решение

EPGM немного привередлив. Согласно этому сообщению, если вы используете EPGM, ваш издатель и подписчик должны находиться на разных хостах. Более подробно здесь, похоже, что это был осознанный выбор команды ZMQ.

Итак, попробуйте, раскручивая свои PUB и SUB на разных машинах (соответственно меняя сетевые адреса).

Причиной может быть то, что окна не поддерживают интерфейс захвата петли. Я попробовал пример погоды с протоколом, измененным на epgm на linux, и он работает нормально (хорошо, показывает некоторые предупреждения о loopback, но сообщения передаются правильно)

Другие вопросы по тегам