独树一帜,带你了解ZeroMQ对字符串处理
发布日期:2021-06-29 22:36:29
浏览次数:3
分类:技术文章
本文共 1549 字,大约阅读时间需要 5 分钟。
一、ZeroMQ对字符串的理解
- 除了字符串的大小之外,ZeroMQ对你发送以及接收的数据一无所知,其只负责发送和接收。
- 因此字符串格式化的责任就交给程序编写者。
二、字符串格式处理需要达成一致
演示说明
- 在C/C++中,字符串是用空字节来终止的,发送时可以使用额外的空字节来发送字符串。例如,下面发送一个6个字节的“Hello”字符串,因为其尾部默认含有一个空字节。
zmq_msg_init_data(&request, "Hello", 6, NULL, NULL);
- 在Python中,字符串不包含空字节。例如,下面也发送一个“Hello”字符串,但是其在网络传输中传输的一个长度5和作为单独字符串的内容。
scoket.send("Hello");
- 因此,当Python调用上面的send()给C语言程序发送一个字符串,C语言接收到该字符串之后,不能确定这个字符串是否是完整的,因为“Hello”是5个字节,尾部不含空字节。
统一字符串处理
- 当你的客户端与服务端的字符串格式未达成一致时,就可能会得到奇怪的结果(例如上面演示案例中Python与C进行交互)。
- 编写ZeroMQ程序的建议是:ZeroMQ字符串是指定长度的,并且在线路上发送时不含结尾空字符。
- 当然具体情况具体分析,此处给出的只是一个一般建议。
三、编写两个C/C++字符串接收与发送函数
- 下面是自定义的两个函数:
- 一个是字符串接收函数:其从网络中接收一个ZeroMQ字符串,并申请多1个字节空间的内存保存该字符串,然后在尾部要添加0,以终止该字符串。
- 一个是字符串发送函数:向网络中发送一个字符串,单发送的字符串不含尾部的空字符。
// 从套接字接收ØMQ字符串,并将其转换为C/C++字符串(在尾部添加0)static char *s_recv(void* socket){ // 此处使用zmq_msg_init()初始化即可, zmq_msg_recv()在内部会自动对zmq_msg_t对象进行大小设定 zmq_msg_t message; zmq_msg_init(&message); int size = zmq_msg_recv(&message, socket, 0); if(size == -1) return NULL; char *string = (char*)malloc(size + 1); memcpy(string, zmq_msg_data(&message), size); zmq_msg_close(&message); string[size] = 0; return string;}
// 将C字符串转换为ØMQ字符串(去掉尾部的'\0'),并发送到指定的套接字上static int s_send(void *socket, char *string){ // 因为是将数据拷贝给zmq_msg_t对象, 因此需要使用zmq_msg_init_size进行初始化 zmq_msg_t msg; zmq_msg_init_size(&msg, strlen(string)); memcpy(zmq_msg_data(&msg), string, strlen(string)); // 发送数据 int rc = zmq_msg_send(&msg, socket, 0); // 关闭zmq_msg_t对象 zmq_msg_close(&msg); return rc;}
- 我是小董,V公众点击"笔记白嫖"解锁更多【ZeroMQ】资料内容。
转载地址:https://dongshao.blog.csdn.net/article/details/105991716 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月16日 22时44分09秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux中设置tomcat自启动
2019-04-30
mysql错误:Row size too large (> 8126).
2019-04-30
umount时目标忙解决办法
2019-04-30
java 判断一个url是否可以访问的方法
2019-04-30
Table 'mysql.user' doesn't exist
2019-04-30
mysql通过frm文件查找表结构定义
2019-04-30
如何在删除ibdata1和ib_logfile的情况下恢复MySQL数据库
2019-04-30
oracle随机数的产生
2019-04-30
oracle分级汇总rollup
2019-04-30
oracle数据库translate函数
2019-04-30
oracle修改日期的显示方式
2019-04-30
inotify的安装
2019-04-30
mysqladmin创建数据库
2019-04-30
DbUtil的介绍使用
2019-04-30
DbUtil异步更新AsyncQueryRunner
2019-04-30
java判断中文汉字工具类
2019-04-30
DbUtils里的ResultSetHandler处理器应用
2019-04-30
Apache WEB服务器启用了OPTIONS方法
2019-04-30
配置文件中的数据库密码加密
2019-04-30