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);
...
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.