2010-04-29 91 views
3

我一直試圖用boost來編寫客戶端/服務器應用程序,目前爲止它已發送和接收,但我似乎無法將X字節讀入向量。Boost ASIO將X字節同步讀入向量中

如果我使用下面的代碼

vector<uint8_t> buf; 

for (;;) 
{ 
buf.resize(4); 
boost::system::error_code error; 

size_t len = socket.read_some(boost::asio::buffer(buf), error); 

if (error == boost::asio::error::eof) 
    break; // Connection closed cleanly by peer. 
else if (error) 
    throw boost::system::system_error(error); // Some other error. 
} 

,數據包被更大然後4個字節的話,好像它一直寫入到這4個字節,直到整個數據包已經收到,但是我希望它取4字節,然後讓我解析它們,然後獲取數據包的其餘部分。

任何人都可以提供一個工作的例子,或至少是如何使它正常工作的指針嗎?

問候,Xeross

回答

3

你說的那個插座有超過4個字節可供讀取,在這種情況下,你的代碼是正確的不斷循環,因爲一個EOF不會遇到,直到所有的數據被讀取。在我看來,你想使用read()而不是read_some(),因爲後者可能會返回少於所需的四個字節。從read_some文檔。

read_some操作可能不會讀取所有請求的字節數。如果您需要確保在阻止操作完成之前讀取所請求的數據量,請考慮使用讀取函數。

您需要讀取前4個字節(使用讀取),處理它們(您不需要在循環中執行此操作),然後執行循環讀取和處理數據,直到獲得錯誤條件或eof。

我想你想更象下面這樣:

vector<uint8_t> buf(4); 
try 
{ 
    size_t len = read(socket, boost::asio::buffer(buf)); 
    assert(len == 4); 
    // process the 4 bytes in buf 
} 
catch (boost::system::system_error &err) 
{ 
    // handle the error e.g by returning early 
} 

boost::system::error_code error; 

while (!error) 
{ 
    size_t len = socket.read_some(boost::asio::buffer(buf), error); 

  // process len bytes 
} 
+0

不這樣做正是它,但它的工作,謝謝。 – 2010-04-30 10:28:43

相關問題