sad*_*sad 1 c++ erlang tcp gen-tcp
当通信的两端都基于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);
}
Run Code Online (Sandbox Code Playgroud)
但不知道如何获得该标头然后使用ei_module来获得真正的解码值.
这就是我解码消息的方式.
这里的代码 这是客户端使用选项{packet,0}连接时所以没有大小的标头.为了允许动态内存分配,我开始使用{packet,N}但不确定如何读取该标头?先感谢您.
在{packet,N}其中选项N是1一个,2个或4所说的头部上的长度为1,2或4个字节,分别发送的数据.标头值以网络字节顺序发送.
要在C++中读取标头,首先N从C++套接字读取字节.
N为1,则您读取的字节包含数据包大小.N是2,则将2个字节读入a uint16_t,然后使用将值转换为主机字节顺序ntohs,这将为您提供uint16_t包含数据包大小的内容.N是4,则将4个字节读入a uint32_t,然后使用将值转换为主机字节顺序ntohl,这将为您提供uint32_t包含数据包大小的内容.一旦获得了数据包大小,就可以读取它指示的字节数,以便获取消息的其余部分并对其进行处理.