当前位置: 首页 > 工具软件 > nanomsg > 使用案例 >

nanomsg应用中的问题整理

公西俊德
2023-12-01

整理最近调试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;
        }


    }
}

再次测试就成功了

 类似资料: