当通信的两端都基于erlang时,我已经工作了,文档清楚地表明使用{packet,N}附加了一个带有消息大小的头,gen_tcp:recv / 2在接收时删除了头。这非常简单。但是,如果接收程序不是基于erlang而是基于c ++,那么我如何只解析标题并知道消息的大小,以便我可以分配该数量的内存。我到现在才使用,
android.system.ErrnoException: mkdir failed: EACCES (Permission denied) when I debug step into File.mkdirs
但不确定如何获取该标头然后使用ei_module获取实际解码值。
这就是我解码消息的方式。
code here 这是当客户端使用选项{packet,0}连接时,因此没有大小的标头。为了允许动态内存分配,我开始使用{packet,N}但不确定如何读取该标头?提前谢谢。
答案 0 :(得分:6)
{packet,N}
选项N
是1,2或4中的一个,分别在发送的数据上放置一个标题,长度分别为1,2或4个字节。标头值以网络字节顺序发送。
要读取C ++中的标头,首先从C ++套接字读取N
个字节。
N
为1,则您读取的字节包含数据包大小。N
为2,请将2个字节读入uint16_t
,然后使用ntohs
将值转换为主机字节顺序,这将为您提供uint16_t
数据包大小。N
为4,请将4个字节读入uint32_t
,然后使用ntohl
将值转换为主机字节顺序,这将为您提供uint32_t
数据包大小。获得数据包大小后,您可以读取它指示的字节数,以获取消息的其余部分并进行处理。