在gen_tcp中使用{packet,N}以及如何在c ++程序中接收数据

时间:2016-04-26 01:58:14

标签: c++ tcp erlang gen-tcp

当通信的两端都基于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}但不确定如何读取该标头?提前谢谢。

1 个答案:

答案 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数据包大小。

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