1

当通信的两端都基于 erlang 并且文档清楚地表明使用 {packet, N} 附加一个带有消息大小的标头并且 gen_tcp:recv/2 在接收时删除标头时,我已经工作过。这很简单。但是,如果接收程序不是基于 erlang,而是基于 c++,我如何只解析标头并知道消息的大小,以便我可以分配该内存量。一直用到现在

//Receive a message from client
while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
{

    //end of string marker
    client_message[read_size] = '\0';
    write(sock , client_message , strlen(client_message));
    //clear the message buffer
    memset(client_message, 0, 2000);
}

但不确定如何获取该标头,然后使用 ei_module 获取真正的解码值。

这就是我解码消息的方式。

此处的代码 这是客户端使用选项 {packet,0} 连接时,因此没有带有大小的标头。为了允许动态内存分配,我开始使用 {packet, N} 但不确定如何读取该标头?先感谢您。

4

1 回答 1

7

where is 1、2 或 4 之一的{packet,N}选项在N发送的数据上分别放置一个长度为 1、2 或 4 个字节的标头。标头值以网络字节顺序发送。

要在 C++ 中读取标头,首先N从 C++ 套接字读取字节。

  • 如果N为 1,则您读取的字节包含数据包大小。
  • 如果N为 2,则将 2 个字节读入 a uint16_t,然后使用 将值转换为主机字节顺序ntohs,这将为您提供uint16_t包含数据包大小的 a。
  • 如果N为 4,则将 4 个字节读入 a uint32_t,然后使用 将值转换为主机字节顺序ntohl,这将为您提供uint32_t包含数据包大小的 a。

获得数据包大小后,您可以读取它指示的字节数,以便获取消息的其余部分并进行处理。

于 2016-04-26T04:14:22.300 回答