这里我在项目中遇到一个坑的地方:
在一个Nanomsg类中实现消息接收,
class Nanomsg
{
bool Nanomsg_slave:: recv(uint8_t *data , int &len)
{
len = nn_recv(_sock, &data, NN_MSG, 0);
printf("len :%d data_recv: ",len);
for (size_t i = 0; i < len; i++)
{
printf("%02x ", data[i]);
}
printf("\n");
if (len>0)
{
return true;
}else{
return false;
}
}
}
别的地方传入buf指针调用函数
Nanomsg _nano_m;
uint8_t buff;
_nano_m.read(buff ,len );
printf("len :%d ,buff: ",len);
for (size_t i = 0; i < len; i++)
{
printf("%02x ", buff[i]);
}
照理说两个打印应该是一样的,然而实际打印出来数据完全不一致
查阅官方手册说明如下
将消息接收到用户分配的缓冲区中
此示例代码将检索 100 字节或更少的消息。 如果一个 发送了较大的消息,它将被截断为 100 字节。
char buf[100]; nbytes = nn_recv (s, buf, sizeof (buf), 0);
将消息接收到由 nanomsg
以下将从管道中获取一条消息,其中分配了一个缓冲区 系统。 它足够大以容纳整个消息。 这是一个很好的 如果消息的大小为 未知。 调用 nn_freemsg(3) 之后 处理消息。
char *buf = NULL; nbytes = nn_recv (s, &buf, NN_MSG, 0); if (nbytes < 0){ /* 处理错误 */ ... } else { /* 处理消息 */ ... nn_freemsg (buf); }
如果是nn_recv函数执行才分配的内存空间,那么我们必须让函数指针地址保持一致
先声明一个空指针buf,然后nn_recv接收数据给buf分配内存。
在让data指针指向buf的地址中数据这样就可以了。
修改如下:
class nanomsg
{
bool Nanomsg_slave:: recv(uint8_t *data , int &len)
{
char* buf = = NULL;
len = nn_recv(_sock, &buf, NN_MSG, 0);
* data = *buf;
printf("len :%d data_recv: ",len);
for (size_t i = 0; i < len; i++)
{
data[i] = buf[i];
printf("%02x ", data[i]);
}
printf("\n");
nn_freemsg(buf);
if (len>0)
{
return true;
}else{
return false;
}
}
}
再次测试就成功了