zmq封装

 

MessageQueue.h

 

#ifndef MESSAGEQUEUE__H__

#define MESSAGEQUEUE__H__

#include <stdint.h>

#include <zmq/zmq.hpp>

//Message pair:

//

//     |-->REP

//REQ -|-->REP

//     |-->REP

//

//     |-->SUB

//PUB -|-->SUB

//     |-->SUB

//

//      |-->PULL -- PUSH -->|

//PUSH -|-->PULL -- PUSH -->|-->PULL

//      |-->PULL -- PUSH -->|

//

//PUSH -->|

//PUSH -->|-->PULL

//PUSH -->|

//

//REQ -->|                       |-->REP

//REQ -->|-->ROUTER -- DEALER -->|-->REP

//REQ -->|                       |-->REP

//

//PAIR -->PAIR -- PAIR -->PAIR

//

//          |-->DEALTER

//ROUTER -->|-->DEALTER

//          |-->DEALTER

//

//          |-->DEALER

//DEALER -->|-->DEALER

//          |-->DEALER

//

//PUB and SUB

//REQ and REP

//REQ and ROUTER

//DEALER and REP

//DEALER and ROUTER

//DEALER and DEALER

//ROUTER and ROUTER

//PUSH and PULL

//PAIR and PAIR

 

//

class CMessageQueue

{

public:

    CMessageQueue(int nType, int nSafe = 1); //inproc : 0

    ~CMessageQueue();

//Bind Type:

//inproc://XX   for thread

//tcp://*:port

//ipc://XXX 

//pgm://192.168.1.1;239.192.1.1:6666    (only used with SUB and PUB)

//epgm://eth0;219.192.1.1:6666          (only used with SUB and PUB)    

 

    void BindSocket(const char* szAddr);

    void Connect(const char* szAddr);

    //Flags:

    // ZMQ_NOBLOCK

    // ZMQ_SNDMORE

    int SendMsg(const char* szMsg, uint32_t nLen, int nFlags = 0);

    //Flags:

    // ZMQ_NOBLOCK

    int RecvMsg(char* szMsg, uint32_t &nLen, int nFlags = 0);

    //Type:

    void SetSockOpt(int nType, const void* pOptVal, size_t nOptValLen);

protected:

    zmq::context_t  m_Context;

    zmq::socket_t   m_Socket;

};

 

 

#endif

 

 

MessageQueue.cpp

 

 

 

 

#include <stdio.h>

#include "MessageQueue.h"

 

using namespace zmq;

 

CMessageQueue::CMessageQueue(int nType, int nSafe)

:m_Context(nSafe), m_Socket(m_Context, nType)

{

}

 

CMessageQueue::~CMessageQueue()

{

}

 

void CMessageQueue::BindSocket(const char* szAddr)

{

    m_Socket.bind(szAddr);

}

 

void CMessageQueue::Connect(const char* szAddr)

{

    zmq_connect(m_Socket, szAddr);

}

 

int CMessageQueue::SendMsg(const char* szMsg, uint32_t nLen, int nFlags)

{

    message_t msg(nLen);

    memcpy((void*)msg.data(), szMsg, nLen);

    return m_Socket.send(msg, nFlags);

}

int CMessageQueue::RecvMsg(char* szMsg, uint32_t &nLen, int nFlags)
{
  int64_t nMore = 0;
    nLen = 0;
    size_t more_size = sizeof(nMore);
    do
    {
        message_t msg;
        int nRet = m_Socket.recv(&msg, nFlags);
        memcpy(szMsg + nLen, (void*)msg.data(), msg.size());
        nLen += msg.size();
        m_Socket.getsockopt(ZMQ_RCVMORE, &nMore, &more_size);
    }
    while(nMore);
    return 0;
}
void CMessageQueue::SetSockOpt(int nType, const void* pOptVal, size_t nOptValLen)
{
    m_Socket.setsockopt(nType, pOptVal, nOptValLen);
}
  

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值