Повышение ASIO: переполнение буфера с пакетом 5 КБ

Я пытался отправить 5,000 пакет байтов boost::asio,
Но я получил ошибку: buffer overflow,
Есть ли способ увеличить сплит это автоматически, или я должен сделать это вручную?

Вот код пакета:

char * CPlayerCharacter::getEnviPacket() //len 5824
{
char * buffer = new char[5824];
char xf[4];
char yf[4];
sprintf(xf, "%f", x);
sprintf(yf, "%f", y);
for(int i =0;i<5824;i++)
{
buffer[i] = 0x00;
}
buffer[0] = 5824 & 0xff;
buffer[1] = 5824 >> 8 & 0xff;
buffer[4] = 4; //minor id
buffer[6] = 1; //major id
buffer[8] = 1;
buffer[12] = id & 0xff;
buffer[13] = (id>>8)  & 0xff;
buffer[14] = (id>>16)  & 0xff;
buffer[15] = (id>>24)  & 0xff;
buffer[20] = mapid;//map id
buffer[24] = 18;
buffer[28] = 0x0a;
buffer[29] = 0x0f;
buffer[30] = 0x16;
for(int i =0;i<4;i++)
{
buffer[5800+i] = xf[i];
buffer[5804+i] = yf[i];
}
buffer[5808] = 0x0c;
buffer[5813] = 0x9d;
buffer[5814] = 0x0f;
buffer[5815] = 0xbf;
buffer[5822] = 0x60;
buffer[5823] = 0x2a;
return buffer;
}

Вот код обработчика:

void CConnection::handle_enter_world(int packetlen)
{
Decryptor dec;
char buffer[packetlen];
boost::asio::async_read(socket_,
boost::asio::buffer(buffer, packetlen),
boost::bind(
&CConnection::nothing, shared_from_this()));
char * decrypted = decrypted = dec.decrypt((char*)&buffer, packetlen);
asynchronousSend(pl.characters[(int)decrypted[0]].getEnviPacket(), 5824);
}

А вот и асинхронная функция отправки:

 void CConnection::asynchronousSend(char * data, int len)
{
boost::asio::async_write(socket_, boost::asio::buffer(data, len), boost::bind(&CConnection::handle_write, shared_from_this()));
delete [] data;
}

Благодарю.

1

Решение

Вы пытаетесь использовать асинхронные вызовы async_read а также async_write синхронно. Это не будет работать.

void CConnection::handle_enter_world(int packetlen)
{
Decryptor dec;
char buffer[packetlen];
boost::asio::async_read(socket_,
boost::asio::buffer(buffer, packetlen),
boost::bind(
&CConnection::nothing, shared_from_this()));

// RIGHT NOW -- nothing has been read yet.
// ...
}

Когда чтение будет завершено, вы получите уведомление с помощью функции обратного вызова, которую вы предоставили (CConnection::nothing). Вот где должна происходить ваша «расшифровка».

Еще одна проблема:

void CConnection::asynchronousSend(char * data, int len)
{
boost::asio::async_write(socket_, boost::asio::buffer(data, len), boost::bind(&CConnection::handle_write, shared_from_this()));
// RIGHT NOW -- nothing has been written yet
delete [] data;
}

Подобная проблема здесь. Когда запись будет завершена, вы получите уведомление с помощью функции обратного вызова, которую вы предоставили (CConnection::handle_write). По телефону delete[] на data преждевременно отправленные вами данные будут повреждены. Вам необходимо удалить эту память в функции обратного вызова (или еще лучше, сделать эту память также общим указателем).

Если вы хотите, чтобы код выполнялся синхронно, вы можете вместо этого использовать синхронные вызовы boost::asio::write а также boost::asio::read (или же read_until).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]