工具常用系列 4 : UDS socket + ZMQ

熟悉以上两种的伙伴,肯定知晓是怎么回事,是否用UDS socket取决于网络环境,客户端服务端如果处在同一个可访问共享内存的环境中,比如同一个OS,或者同一个container,那么UDS用起来还是比较方便的。

UDS通讯过程_法号:行颠的博客-CSDN博客

ZMQ则封装了socket的很多操作,用户使用起来也方便。

本文主要是记录一下开发过的工具里面用到的场景。

hpp样例


#ifndef CLI_UDSZMQHANDLER_H
#define CLI_UDSZMQHANDLER_H

#include <zmq.hpp>
#include <string>
#include <iostream>
#include "Message.h"

class UdsZmqHandler final {
public:
    UdsZmqHandler(zmq::socket_type zmqsocktype);
    ~UdsZmqHandler() = default;
    UdsZmqHandler(const UdsZmqHandler&) = delete;
    UdsZmqHandler operator=(const UdsZmqHandler&) = delete;


    void recv(Message& msg);
    int send(const Message &msg);
    void *handle(){ return socket_.handle(); }

private:
    zmq::context_t context_;
    zmq::socket_t socket_;
};

cpp样例


#include "UdsZmqHandler.h"

UdsZmqHandler::UdsZmqHandler(zmq::socket_type zmqsocktype):socket_{context_, zmqsocktype}
{
    std::string your_tool_socketpath= "ipc://@your_tool_-local.sock";

    if(zmq::socket_type::req == zmqsocktype)
    {
        socket_.connect(your_tool_socketpath.c_str());
        constexpr int timeoutval = 6000;
        socket_.set(zmq::sockopt::sndtimeo, timeoutval);
        socket_.set(zmq::sockopt::rcvtimeo, timeoutval);
    }
    else
    {
        socket_.bind(your_tool_socketpath.c_str());
    }
}

int UdsZmqHandler::send(const Message &msg)
{
    auto ret = socket_.send(msg.convert2ZmqMessage(), zmq::send_flags::none);
    if (!ret)
    {
        std::cout << "CommunicationHandler: send failed with eagain."<< std::endl;
        return TOOL_ERR;
    }
    return TOOL_OK;
}

void UdsZmqHandler::recv(Message& msg)
{
    zmq::message_t zmsg;

    auto ret = socket_.recv(zmsg);
    if (!ret)
    {
        std::cout << "CommunicationHandler: recv empty."<<std::endl;
    }
    msg.parseMessage(zmsg);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值