ZMQ pub-sub

进程内:inproc:///tmp/worker0

进程间:ipc:///tmp/worker0

自定义消息

struct Info {
    short len = 0;
    char content[10];
};

Server

void pub()
{
    void *context = zmq_ctx_new ();
    void *responder = zmq_socket (context, ZMQ_PUB);
    int rc = zmq_bind (puber, SOCKET_CHANNEL);
    if (rc != 0) printf("bind fail %d", rc);
    assert (rc == 0);
    
    zmq_pollitem_t pollItem[] = { {responder, 0, ZMQ_POLLOUT, 0} };
    long timeout = 1000;
    int request = 0;
    while (1) {
        rc = zmq_poll(pollItem, 1, timeout);
        if (rc < 0) {
            printf("poll failed: %s\n", zmq_strerror(zmq_errno()));
        }
        else if (0 == rc) {
            printf("no events\n");
            continue;
        }
        else {
            printf("Sending\n");
        }

        short sEvent = pollItem[0].revents & pollItem[0].events;
        if (sEvent & ZMQ_POLLOUT) {
            zmq_msg_t msg;
            rc = zmq_msg_init_size (&msg, sizeof(Info));
            assert (rc == 0);
            string str = "pub number: " + to_string(request++);
            Info info;
            info.len = str.size();
            memcpy (info.content, str.c_str(), info.len);
            info.content[info.len] = '\0';
            memcpy (zmq_msg_data (&msg), &info, sizeof(Info));
            auto len = zmq_msg_send (&msg, responder, ZMQ_DONTWAIT);
            if (-1 == len) {
                printf("Send ErrorInfo: %s\n", zmq_strerror(zmq_errno()));
            }
            else {
                printf("send ret %d, msg_size %d\n", len, sizeof(Info));
            }
            zmq_msg_close(&msg);
        }
    }
}

Client

void sub() 
{
    printf ("Connecting to hello world server…\n");
    void *context = zmq_ctx_new ();
    void *subscriber = zmq_socket (context, ZMQ_SUB);
    if (0 != zmq_connect (subscriber, SOCKET_CHANNEL)) {
        printf("connect failed \n");
    }

    if (zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0)) {
        printf("zmq_setsockopt fail\n");
    }

    const int MSG_LENGTH = 1024;
    unsigned char MSG[MSG_LENGTH];

    zmq_pollitem_t pollItem[] = { {subscriber, 0, ZMQ_POLLIN, 0} };
    long timeout = 1000;
    while (1) {
        int rc = zmq_poll(pollItem, 1, timeout);
        if (rc < 0) {
            printf("poll failed: %s\n", zmq_strerror(zmq_errno()));
        }
        else if (0 == rc) {
            printf("no events\n");
            continue;
        }
        else {
            printf("Recving\n");
        }

        short event = pollItem[0].revents & pollItem[0].events;
        if (event & ZMQ_POLLIN) {
            zmq_msg_t msg_r;
            zmq_msg_init(&msg_r);
            if (-1 != zmq_msg_recv(&msg_r, subscriber, ZMQ_DONTWAIT)) {
                unsigned int length = zmq_msg_size(&msg_r);
                memset(MSG, 0, MSG_LENGTH);
                memcpy(MSG, zmq_msg_data(&msg_r), length);
                Info* info = reinterpret_cast<Info*>(MSG);
                printf("Received Msg: %d, %s\n", info->len, info->content);
            }
            else {
                printf("Recv ErrorInfo: %s\n", zmq_strerror(zmq_errno()));
            }
            zmq_msg_close(&msg_r);
        }
    }
    zmq_close (subscriber);
    zmq_ctx_destroy (context);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值