Дополненные данные в recv () api - PullRequest
0 голосов
/ 29 марта 2012

Я работаю над клиентским серверным приложением TCP, используя c ++. В этом проекте теперь разрешены сторонние библиотеки.

Здесь обмен между клиентским сервером происходит с использованием четко определенного формата протокола. Как только клиент получит пакет, он отправит его для анализа. У меня есть менеджер протокола, который позаботится о выполнении анализа.

У меня следующие сомнения Когда данные поступают на клиент из сети, ОС буферизует их до тех пор, пока приложение не вызовет функцию recv ().

Таким образом, два сообщения msg1 и msg2 поступают в буфер, и вызов recv возвращает msg1 + msg2. Теперь это может привести к сбою операции синтаксического анализа.

Мои запросы 1. является ли вышеупомянутое предположение правильным или нет? 2. Если вышеупомянутое предположение верно, то как решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Revathy,

Что вам нужно сделать, это сделать пакет фиксированной длины или, по крайней мере, заголовок фиксированной длины, за которым следуют данные переменной длины.

Заголовок должен содержать размер пакета. Таким образом, в функции recv вы всегда читаете байты заголовка, декодируете размер пакета и читаете остальную часть пакета, используя другой вызов recv.

Таким образом, даже когда ваш уровень TCP буферизует любое количество пакетов, вы сможете правильно его прочитать

    unsigned char* pBuffer = NULL;
    pBuffer = new unsigned char[MESSAGE_HEADER_LENGTH];

    // reading header from socket
    int nRet = recv(sock,(char*)pBuffer,MESSAGE_HEADER_LENGTH,0);
    int nDataLen = //Read the packet length from pBuffer
    // reading body from socket

    unsigned char* pPacket = NULL;
    pPacket= new unsigned char[nDataLen ];
    nRet = recv(sock,(char*)pPacket ,nDataLen ,0 );
0 голосов
/ 29 марта 2012

В TCP вы не можете видеть границы пакетов, поэтому, если оба пакета прибывают до того, как вы позвоните recv(), вы получите содержимое обоих пакетов за один раз.

В UDP границы пакетов сохраняются, поэтому каждый вызов recv() возвращает один пакет.

...