ZeroMQ:04---ZeroMQ对字符串处理

一、ZeroMQ对字符串的理解

  • 除了字符串的大小之外,ZeroMQ对你发送以及接收的数据一无所知,其只负责发送和接收。
  • 因此字符串格式化的责任就交给程序编写者。

二、字符串格式处理需要达成一致

1. 演示说明

  • 在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个字节,尾部不含空字节。

2. 统一字符串处理

  • 当你的客户端与服务端的字符串格式未达成一致时,就可能会得到奇怪的结果(例如上面演示案例中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;
}

————————————————
版权声明:本文为CSDN博主「董少、」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41453285/article/details/105991716

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值