gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:44:27 27 4
gpt4 key购买 nike

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

//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);
}

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

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

code here这是客户端使用 {packet,0} 选项连接时,因此没有带有大小的 header 。为了允许动态内存分配,我开始使用 {packet, N} 但不确定如何读取该 header ?提前谢谢你。

最佳答案

{packet,N} 选项,其中 N 是 1、2 或 4 之一,在发送的数据上放置 1、2 或 4 字节的 header 在长度上,分别。 header 值以网络字节顺序发送。

要读取 C++ 中的 header ,首先从您的 C++ 套接字中读取 N 个字节。

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

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

关于c++ - 在 gen_tcp 中使用 {packet, N} 以及如何在 C++ 程序中接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36854060/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com