2016-04-26 4 views
1

Я работал, когда оба конца связи были основаны на erlang, и документация дает понять, что использование {package, N} добавляет заголовок с размер сообщения и gen_tcp: recv/2 удаляет заголовок при приеме. Это довольно просто. Тем не менее, если принимающая программа не основана на erlang, а скорее на C++, я просто разбираю заголовок и знаю размер сообщения, чтобы я мог выделить этот объем памяти. Я до сих пор,, используя {пакет, N} в gen_tcp и как получать данные в программе 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, чтобы получить реальное значение декодированного.

Вот как я декодировал сообщение.

code here Это было, когда клиент подключился к опции {пакет, 0}, чтобы не было заголовка с размером. Чтобы разрешить динамическое распределение памяти, я начинаю использовать {пакет, N}, но не знаю, как читать этот заголовок? Заранее спасибо.

ответ

5

Опция {packet,N}, где N является одним из 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, содержащий размер пакета.

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

 Смежные вопросы

  • Нет связанных вопросов^_^