Re: CSocket & Receive
От: Всеволод Россия  
Дата: 30.06.03 07:08
Оценка: 6 (2)
Здравствуйте, Twil, Вы писали:

T>
T>void CClient::OnReceive(int nErrorCode)
T>{
T>    char myBuffer[512];
T>    int Received=0;
T>    Received = Receive(myBuffer, 512);
T>    myBuffer[Received]='\0';
T>    CSocket::OnReceive(nErrorCode);
T>}
T>


T>Здраствуйте, уважаемые!

T>Вот есть такой код, который дайтся во многих книгах и исходниках. Но как-то все молчат на тему того, что буфера для приема данных может не хватить. Как можно обойти эту неприятность и написать универсальный код?

Сделаем буфер переменной длины.
class CClient...
{
...
   byte *m_pReceiveBuffer;
   DWORD m_dwReceiveBufferSize;
...
}

CClient::CClient()
{
...
   m_dwReceiveBufferSize=0;
   m_pReceiveBuffer=NULL;
...
}

Перед приемом каждого сообщения будем проверять фактический размер входящего сообщения.
Если его размер будет больше, чем мы выделили памяти под буфер — увеличим буфер
void CClient::OnReceive(int nErrorCode)
{
   DWORD dwQueueSize;
   IOCtl(FIONREAD, &dwQueueSize);

   if (dwQueueSize>m_dwReceiveBufferSize)
   {
      m_dwReceiveBufferSize=dwQueueSize;
      m_pReceiveBuffer=static_cast<byte*>(realloc(m_pReceiveBuffer, m_dwReceiveBufferSize));
   }

    int Received=0;
    Received = Receive(m_pReceiveBuffer, m_dwReceiveBufferSize);

    CSocket::OnReceive(nErrorCode);
}

Не забываем убирать за собой
CClient::~CClient()
{
...
   free(m_pReceiveBuffer);
...
}
CSocket & Receive
От: Twil Россия  
Дата: 27.06.03 18:22
Оценка:
void CClient::OnReceive(int nErrorCode)
{
    char myBuffer[512];
    int Received=0;
    Received = Receive(myBuffer, 512);
    myBuffer[Received]='\0';
    CSocket::OnReceive(nErrorCode);
}


Здраствуйте, уважаемые!
Вот есть такой код, который дайтся во многих книгах и исходниках. Но как-то все молчат на тему того, что буфера для приема данных может не хватить. Как можно обойти эту неприятность и написать универсальный код?




28.06.03 01:02: Перенесено модератором из '.NET' — AVK
Re: CSocket & Receive
От: Cordell Россия  
Дата: 30.06.03 07:16
Оценка:
Здравствуйте, Twil

Receive возвращает тебе сколько прочитал... Сталобыть, если он вернул, сколько просил (512 в твоем примере) то, знать еще есть... Делаешь реалок на еще 512 и второй раз Receive зовешь, получаешь следующуую порцию, которую клаедешь в хвост первой и так по циклу, до пока Receive не выдасть число меньшее, чем ты запросил. Примерно так. Но, вообще, если пакеты ты сам формируешь, то нормальным ходом будет в первых двух байтах его длинну передаватью.

И не надо в стеке буфера заводить — плохой тон. А в книжках порой приследуют простую цель — чем проще пример, тем он доступнее для понимания. Посему, не следует их 1:1 в реальную жизнь переносить, особенно в коммерческих проэктах.

Всех благ. Артем.
Re: CSocket & Receive
От: Twil Россия  
Дата: 30.06.03 13:21
Оценка:
Всем спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.