tcp — использование {package, N} в gen_tcp и как получить данные в программе на c ++

Я работал, когда оба конца связи были основаны на 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}, но не знаю, как прочитать этот заголовок? Заранее спасибо.

1

Решение

{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 содержащий размер пакета.

Получив размер пакета, вы можете прочитать количество байтов, которое он указывает, чтобы получить оставшуюся часть сообщения и обработать его.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]