nanomsg应用中的问题整理

整理最近调试nannomsg遇到很多坑,写个博客整理一下

1.消息接收

这里我在项目中遇到一个坑的地方:

在一个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]);
      }

照理说两个打印应该是一样的,然而实际打印出来数据完全不一致

查阅官方手册说明如下

nn_recv :

例子

将消息接收到用户分配的缓冲区中

此示例代码将检索 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;
        }


    }
}

再次测试就成功了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值