为什么ZeroMQ PGM组播没有收到组播消息? (C ++,Windows)

时间:2017-03-08 07:41:25

标签: c++ windows udp zeromq multicast

环境设置:
- 多播发送和发送接收应用程序在同一台机器上运行

我正在将ZeroMQ多播与OpenPGM支持集成,但在我的示例代码下面遇到问题。

即。 "接收方应用程序中未收到多播消息" 。如果我做错了,请纠正我。也无法找到关于ZeroMQ PGM组播要求的适当示例。

// ZMQ_pgm_receive.cpp : 
//
//Headers
#include "stdafx.h"
#include "zmq.h"
#include <iostream>
#include <windows.h>

std::string fullurl = "pgm://eth0;239.255.0.1:30001";
static int roundtrip_count = 50;
static size_t message_size = 4;

int _tmain(int argc, _TCHAR* argv[])
{
    void *ctx = NULL,
         *s = NULL;
    int con;
    int i;

    ctx = zmq_init (1);
    if (!ctx) {
        printf ("error in zmq_init: %s\n", zmq_strerror (errno));
        return -1;
    }

    s = zmq_socket (ctx, ZMQ_SUB);
    if (!s) {
        printf ("error in zmq_socket: %s\n", zmq_strerror (errno));
        return -1;
    }


    con = zmq_bind(socket, fullurl.c_str()); 
    if (con == 0) {
        printf ("error in zmq_bind: %s\n", zmq_strerror (errno));
        return -1;
    }
    zmq_msg_t msg;

    int rc = zmq_msg_init (&msg);
    if (rc != 0) {
        printf ("error in zmq_msg_init: %s\n", zmq_strerror (errno));
        return -1;
    }

    for (i = 0; i != roundtrip_count; i++) {

        rc = zmq_recvmsg (s, &msg, 0);
        if (rc < 0) {
            printf ("error in zmq_recvmsg: %s\n", zmq_strerror (errno));
            return -1;
        }
        printf("message received\n");

        if (zmq_msg_size (&msg) != message_size) {
            printf ("message of incorrect size received\n");
            return -1;
        }
        Sleep(1000);

    }

    rc = zmq_msg_close (&msg);
    if (rc != 0) {
        printf ("error in zmq_msg_close: %s\n", zmq_strerror (errno));
        return -1;
    }

    rc = zmq_close (s);
    if (rc != 0) {
        printf ("error in zmq_close: %s\n", zmq_strerror (errno));
        return -1;
    }
    /*rc = zmq_ctx_term (ctx);
    if (rc != 0) {
        printf ("error in zmq_ctx_term: %s\n", zmq_strerror (errno));
        return -1;
    }
ctx = NULL;
*/

return 0;
}
// ZMQ_pgm_send.cpp :
//
#include "stdafx.h"
#include "zmq.h"
#include <iostream>
#include <windows.h>

std::string fullurl = "pgm://eth0;239.255.0.1:30001";    
static int roundtrip_count = 50;
static size_t message_size = 4;

int _tmain(int argc, _TCHAR* argv[])
{
    void *ctx = NULL,
         *s = NULL;
    int con;
    int i;

    ctx = zmq_init (1);
    if (!ctx) {
        printf ("error in zmq_init: %s\n", zmq_strerror (errno));
        return -1;
    }

    s = zmq_socket (ctx, ZMQ_PUB);
    if (!s) {
        printf ("error in zmq_socket: %s\n", zmq_strerror (errno));
        return -1;
    }

    con = zmq_connect(socket, fullurl.c_str()); 
    if (con == 0) {
        printf ("error in zmq_connect: %s\n", zmq_strerror (errno));
        return -1;
    }
    zmq_msg_t msg;

    int rc = zmq_msg_init_size (&msg,message_size);
    if (rc != 0) {
        printf ("error in zmq_msg_init: %s\n", zmq_strerror (errno));
        return -1;
    }

    memset(zmq_msg_data (&msg),'A', message_size ); 
    for (i = 0; i != roundtrip_count; i++) {

        rc = zmq_sendmsg (s, &msg, 0);
        if (rc < 0) {
            printf ("error in zmq_sendmsg: %s\n", zmq_strerror (errno));
            return -1;
        }
    }

    rc = zmq_msg_close (&msg);
    if (rc != 0) {
        printf ("error in zmq_msg_close: %s\n", zmq_strerror (errno));
        return -1;
    }

    rc = zmq_close (s);
    if (rc != 0) {
        printf ("error in zmq_close: %s\n", zmq_strerror (errno));
        return -1;
    }
    /*rc = zmq_ctx_term (ctx);
    if (rc != 0) {
        printf ("error in zmq_ctx_term: %s\n", zmq_strerror (errno));
        return -1;
    }
    ctx = NULL;
    */

    return 0;
}

如果我做错了,请纠正我。

1 个答案:

答案 0 :(得分:0)

解决了上述评论中提出的 [步骤0]
一个人应该 检测

a缺少ZMQ_SUBSCRIBE设置,因此SUB端过滤所有流量

  

ZMQ_SUBSCRIBE:建立消息过滤器

     


   ZMQ_SUBSCRIBE 选项应在ZMQ_SUB套接字上建立新的邮件过滤器。 新创建的ZMQ_SUB套接字应过滤掉所有传入的消息,因此您应调用此选项以建立初始消息过滤器。

  长度为零的空 option_value 应订阅所有传入消息。非空的 option_value 应订阅以指定前缀开头的所有邮件。多个过滤器可以附加到单个ZMQ_SUB套接字,在这种情况下,如果消息与至少一个过滤器匹配,则应接受该消息。

无论如何, welcome&amp;享受这些用于分布式系统计算的智能工具!