如何在C ++中使用ZeroMQ发送包含数组的结构时解决错误

时间:2018-02-11 15:23:21

标签: c++ zeromq

客户端向服务器发送十次结构(包含一个数组)。服务器作业是接收此结构并进行打印。但它只接收一次结构并打印出来然后退出给出这个错误 “terminate called after throwing an instance of 'zmq::error_t'”。

这是客户端C ++代码:

#include <zmq.hpp>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <zmq2.h>
#include "structure.h"

int main (void)
{
    int flags=0,value,buffer[10];
    printf ("Connecting to hello world server…\n");
    void *context = zmq_ctx_new ();
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requester, "tcp://localhost:5555");


    for(int i=0;i!=10;i++)
    {
        msg.arr[i]=i;   
    }

    for(int i=0;i!=10;i++)
    {
        printf ("Sending Hello %d…\n", i);
        zmq_send(requester,&msg, sizeof(Message),0);
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

这是服务器C ++代码:

#include <stdint.h>
#include "structure.h"
#include "zmq.hpp"
#include <string>
#include <iostream>
#include <unistd.h>

int main () {
    int val;
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");
    while(true)
    {
        Message* msg;   
        zmq::message_t zmsg;
        socket.recv(&zmsg);
        msg = (Message*)zmsg.data();
        for(int i=0;i<10;i++)
        {
            std::cout<<msg->arr[i]<<std::endl;  
        }
        sleep(1);
    }
    return 0;
}

这是 structure.h

struct Message
{
  int arr[10];
}msg;

如何从服务器端接收所有十个结构并打印出十个结构?

提前致谢。

1 个答案:

答案 0 :(得分:1)

更好地使用XREQ / XREP的PUSH / PULL,作为原始的REP / REQ强制执行严格的.send() - 。recv() - 。send() - 。recv。 () - ......

如果您的需求完全如上所述,只需更改ZeroMQ可扩展形式通信原型模式就足够了。

如果您选择尽可能接近REQ/REP&#34;相似度&#34;,请使用 XREQ/XREP ,如果有更多话要说并计划一些进一步扩展分布式信令/消息服务基础设施,使用一对 C->S + S->C + PUSH/PULL > PUSH/PULL

如果一个消息传递范例只能与一个独占的节点对共存,那么 PAIR/PAIR 可能是一个选项,其中PAIR/PAIR(已实施)不提供以后扩展到.connect()N:11:MN:M对等节点框架的方法。