首页 > 其他分享 >zmq代理类

zmq代理类

时间:2022-12-01 17:05:33浏览次数:37  
标签:return 代理 ret ERROR msg zmq config


一 需求:

将zmq 常用模式进行封装

二 代码:

#ifndef SRC_ZMQ_AGENT_HPP_
#define SRC_ZMQ_AGENT_HPP_
#include <string.h>
#include <string>
#include <map>
#include "zmq.h"
namespace zmq_self_agent {
using namespace std;
enum {
BIND,
CONNECT
};
enum {
NO_ERROR,
CONTEXT_ERROR,
SOCKET_ERROR,
SOCKET_TYPE_ERROR,
BIND_ERROR,
CONNECT_ERROR,
SOCKET_ATTRIBUTE_ERROR
};
class zmq_config {
public:
zmq_config() {
sock_type = 0;
addr = nullptr;
send_hwm = 1000;
recv_hwm = 1000;
send_timeout = 5;
}
public:
unsigned char sock_type;
const char *addr;
int send_hwm;
int recv_hwm;
int send_timeout;
};
class zmq_agent {
public:
zmq_agent() {
context_ = nullptr;
socket_ = nullptr;
init_map();
}
virtual ~zmq_agent() {
if (nullptr != socket_) {
zmq_close(socket_);
socket_= nullptr;
}
if (nullptr != context_) {
zmq_ctx_destroy(context_);
context_ = nullptr;
}
}
public:
unsigned char init(const zmq_config &config) {
unsigned char ret = init_socket(config);
if (ret) {
return ret;
}
ret = init_link(config);
if (ret) {
return ret;
}
ret = init_sock_attribute(config);
return ret;
}
int send(const char *info, int len)
{
zmq_msg_t msg = {0};
int rc = zmq_msg_init_size(&msg, len);
if (rc) {
return 0;
}
memcpy(zmq_msg_data(&msg), info, len);
rc = zmq_msg_send(&msg, socket_, 0);
zmq_msg_close(&msg);
return rc;
}
bool recv(string &recv_str) {
zmq_msg_t msg = {0};
int rc = zmq_msg_init(&msg);
if (rc) {
return false;
}
int len = zmq_msg_recv(&msg, socket_, 0);
bool succ = false;
if (len > 0) {
recv_str.assign((char *)zmq_msg_data(&msg), len);
succ = true;
}
zmq_msg_close(&msg);
return succ;
}
private:
inline void init_map() {
sock_type_map_[ZMQ_PULL] = BIND;
sock_type_map_[ZMQ_PUB] = BIND;

sock_type_map_[ZMQ_PUSH] = CONNECT;
sock_type_map_[ZMQ_SUB] = CONNECT;
}
inline unsigned char init_socket(const zmq_config &config) {
if (nullptr == (context_ = zmq_ctx_new())) {
return CONTEXT_ERROR;
}
if (nullptr == (socket_ = zmq_socket(context_, config.sock_type))) {
return SOCKET_ERROR;
}
return NO_ERROR;
}
unsigned char init_link(const zmq_config &config) {
auto it = sock_type_map_.find(config.sock_type);
if (end(sock_type_map_) == it) {
return SOCKET_TYPE_ERROR;
}
unsigned char ret = 0;
if (BIND == it->second) {
ret = zmq_bind(socket_, config.addr);
if (ret) {
return BIND_ERROR;
}
return NO_ERROR;
}
ret = zmq_connect(socket_, config.addr);
if (ret) {
return CONNECT_ERROR;
}
return NO_ERROR;
}
inline unsigned char init_sock_attribute(const zmq_config &config) {
unsigned char ret = zmq_setsockopt(socket_, ZMQ_SNDHWM, &config.send_hwm, sizeof(config.send_hwm));
if (ret) {
return SOCKET_ATTRIBUTE_ERROR;
}
ret = zmq_setsockopt(socket_, ZMQ_RCVHWM, &config.recv_hwm, sizeof(config.recv_hwm));
if (ret) {
return SOCKET_ATTRIBUTE_ERROR;
}
ret = zmq_setsockopt(socket_, ZMQ_SNDTIMEO, &config.send_timeout, sizeof(config.send_timeout));
if (ret) {
return SOCKET_ATTRIBUTE_ERROR;
}
return NO_ERROR;
}
private:
void *context_;
void *socket_;
private:
map<unsigned char, unsigned char>sock_type_map_;
};
}

#endif /* SRC_ZMQ_AGENT_HPP_ */

 

标签:return,代理,ret,ERROR,msg,zmq,config
From: https://blog.51cto.com/u_15899033/5902961

相关文章

  • C#通过UrlReWrite配置重定向以及代理Proxy中的超时请求
    项目使用UrlReWrite重定向功能,同时也设置了代理,但是IIS的默认是120秒,高级设置里的连接超时也设置7200秒,但是网站在导出excel的时候,还是出现502-web服务器在作为网关或代理服......
  • 如何查哪些IP是代理IP呢?
    代理ip又叫代理服务器英文全称是(ProxyServer),也叫做代理IP,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。代理服务器就好象一个大的Cache,这样就能......
  • redis集群之分片集群的原理和常用代理环境部署
    上篇文章刚刚介绍完redis的主从复制集群,但主从复制集群主要是为了解决redis集群的单点故障问题,通过整合哨兵能实现集群的高可用;但是却无法解决数据容量以及单节点的压力问......
  • socks5代理协议
     最近用到ssh正向和反向端口转发,顺便看到动态端口转发实际上使用的是本地socks代理,于是对socks协议进行了学习,同时参考了其他网友的帖子,记录如下: socks的使用场合就不......
  • nodejs 服务器监听的主机名称导致的本地前端代理错误
    问题前端本地开发服务器一直是正常的,直到某一天启动时出现这个错误:代理服务的配置如下:(http://localhost:8000跑着一个本地启动的nodejs服务器。)const{createProxyMid......
  • windows 10 更新代理
    安装Windows更新Windows更新扫描、下载、安装,每一部分都采用独立的服务。Windows更新客户端利用WindowsHTTP服务(WinHTTP)扫描可用更新;BackgroundIntelligentT......
  • SSH 命令的三种代理功能(-L/-R/-D)
    日常开发中,数据库没有对外授权,只对特定服务器(服务器A,B,C)进行了授权,因此只能通过服务器A,B,C作为跳板访问数据库;但是通过在服务器A/B/C上进行端口映射,就可以变相实现外部......
  • Java内功修炼系列:代理模式及动态代理
    目录​​一代理模式​​​​1.1简介​​​​1.2代理模式角色定义​​​​二静态代理​​​​2.1介绍和实例​​​​2.2静态代理的缺点​​​​三动态代理​​​​3.1......
  • [ZMQ] ZeroMQ rk3308 性能测试
    目录stepLatencyTest(one-waylatency)tcpinprocThroughputTesttcpinprocstepadbpush所有附件到udisk目录adbpush的文件添加执行权限LatencyTest(one-waylaten......
  • 华为分布式数据库gaussdb,代理长连接会把查询语句分别到主节点上的优化思考
    智能刊登Gaussdb优化点 :1.确定是查询的语句,可以通过hint语句指定在读节点上查询,避免因代理长连接到主节点查询;用法:/*forceSLAVE*/SELECTCOUNT(1)assuccessFROM......