Здравствуйте, 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);
...
}
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