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