2013-05-31 55 views
1

我試圖通過boost::asio發送5,000個字節的char數據包。 但我得到錯誤:buffer overflow。 有沒有辦法增強自動分割或我必須手動執行?Boost ASIO:帶有5 kb數據包的緩衝區溢出

下面是包代碼:

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); 
} 

這裏是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; 
} 

感謝。

+0

這取決於您使用的代碼,但您沒有發佈_that_。 – Chad

+0

好的,我添加了代碼。 –

回答

0

您試圖以同步方式使用異步調用async_readasync_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)收到通知。通過data提前致電delete[],您發送的數據將被破壞。您需要刪除回調函數中的內存(或者更好的是,將該內存也變爲共享指針)。

如果您希望代碼同步執行,則可以使用同步調用boost::asio::writeboost::asio::read(或read_until)。

+0

感謝您的回答,但是有沒有想法發送這個5kb的數據包而不需要手動讓它泄露? –

+0

根本不需要分割它,您需要使用適當調用的函數。 – Chad

+0

我已經改變它在handle_async_write回調中刪除,但仍然發生同樣的問題。 錯誤:檢測到***緩衝區溢出***:./遊戲終止 系統:ubuntu –