C++ Boost ASIO:5 kb数据包的缓冲区溢出
我试图通过C++ Boost ASIO:5 kb数据包的缓冲区溢出,c++,boost,boost-asio,send,packet,C++,Boost,Boost Asio,Send,Packet,我试图通过boost::asio发送5000bytes字符包。 但我得到了错误:缓冲区溢出。 有没有办法让它自动拆分,或者我必须手动拆分 以下是数据包代码: 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 =
boost::asio
发送5000
bytes字符包。
但我得到了错误:缓冲区溢出
。
有没有办法让它自动拆分,或者我必须手动拆分
以下是数据包代码:
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;
}
下面是asynchronousSend函数:
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;
}
谢谢。您正在尝试以同步方式使用异步调用
async\u read
和async\u 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\u write
)通知您。过早调用数据上的delete[]
,将损坏您发送的数据。您需要在回调函数中删除该内存(或者更好的是,将该内存也变成共享指针)
如果您希望代码同步执行,可以使用同步调用boost::asio::write
和boost::asio::read
(或read_,直到
)。这取决于您使用的代码,但您没有发布。感谢您的回答,但是有没有办法在不手动拆分的情况下发送这个5kb的数据包?你根本不需要拆分它,你需要正确地使用你正在调用的函数。我在handle\u async\u write callback中将它更改为delete,但同样的问题仍然发生。错误:***检测到缓冲区溢出***:./游戏终止系统:UBUNTUW此缓冲区溢出发生在何处?当你解密数据包时?您是否已将该代码移动到读取处理程序(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;
}