Я работал, когда оба конца связи были основаны на erlang, и документация ясно дает понять, что при использовании {package, N} добавляется заголовок с размером сообщения, а gen_tcp: recv / 2 удаляет заголовок при получении. Это довольно просто. Однако, если принимающая программа не основана на эрланге, а скорее на 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 для получения реального декодированного значения.
Вот как я декодировал сообщение.
код здесь
Это было, когда клиент подключился с параметром {package, 0}, поэтому заголовок с размером не существовал. Чтобы разрешить динамическое распределение памяти, я начинаю использовать {package, N}, но не знаю, как прочитать этот заголовок? Заранее спасибо.
{packet,N}
вариант где N
is one of 1, 2 или 4 помещает заголовок отправляемых данных длиной 1, 2 или 4 байта соответственно. Значение заголовка отправляется в порядке сетевых байтов.
Чтобы прочитать заголовок в C ++, сначала прочитайте N
байты из вашего сокета C ++.
N
равен 1, то прочитанный байт содержит размер пакета.N
2, считайте 2 байта в uint16_t
, а затем преобразовать значение в порядок байтов хоста, используя ntohs
, который даст вам uint16_t
содержащий размер пакета.N
4, прочитайте 4 байта в uint32_t
, а затем преобразовать значение в порядок байтов хоста, используя ntohl
, который даст вам uint32_t
содержащий размер пакета.Получив размер пакета, вы можете прочитать количество байтов, которое он указывает, чтобы получить оставшуюся часть сообщения и обработать его.
Других решений пока нет …