2012-06-18 56 views
4

我有一個C++服務器,它使用boost :: asio做讀/寫操作 - 寫出這些消息工作正常 - 但由於某種原因,我無法讓讀取工作boost asio async_read_some只讀數據片

我從客戶端發送給它的消息是15 16位無符號短褲 - 我的測試消息是這樣的:

1, 34, 7, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0 
現在

我看到這樣的事情不斷在服務器上。讀出往往是破碎和/或通過256

乘以這是一個運行在發送兩次

reading length = 8: [1 34 7 0 0 0 0 0] 
reading length = 3: [1024 0 0] 
reading length = 3: [0 0 0] 
reading length = 8: [1 34 7 0 0 0 0 0] 
reading length = 6: [1024 0 0 0 0 0] 

這是第二次運行在發送兩次

reading length = 8: [1 34 7 0 0 0 0 0] 
reading length = 6: [1024 0 0 0 0 0] 
reading length = 6: [1 34 7 0 0 0] 
reading length = 1: [0] 
reading length = 0: [] 
reading length = 0: [] 
reading length = 2: [0 0] 
reading length = 2: [0 0] 
reading length = 1: [0] 

這是第三次運行發送一次(我不知道這裏發生了什麼)

reading length = 14: [256 8704 1792 0 0 0 0 0 1024 0 0 0 0 0] 

這裏是實際的服務器讀取代碼

void Session::start(void) { 
    msg_interface->add_msg_listener(this); 
    _socket.async_read_some(
    boost::asio::buffer(_read_data_buffer, READ_DATA_BUFFER_LENGTH), 
    boost::bind(&Session::handle_read, this, boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

void Session::handle_read(const boost::system::error_code& error, std::size_t bytes_transferred) { 
    if (error) { 
    msg_interface->remove_msg_listener(this); 
    delete this; 
    } else { 
    if (bytes_transferred != 0) { 
     // print what we've received 
     const int length = bytes_transferred/sizeof(uint16_t); 
     std::cout << "reading length = " << length << ": ["; 
     for (int i = 0; i < length; i++) { 
     const uint16_t data = ntohs(_read_data_buffer[i]); 
     std::cout << data; 
     if (i != length - 1) { 
      std::cout << " "; 
     } 
     } 
     std::cout << "]" << std::endl; 
    } 
    _socket.async_read_some(
     boost::asio::buffer(_read_data_buffer, READ_DATA_BUFFER_LENGTH), 
     boost::bind(&Session::handle_read, this, boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
    } 
} 

的變量如下

const int READ_DATA_BUFFER_LENGTH = 1024; 

class AbstractSession { 
protected: 
    uint16_t _read_data_buffer[READ_DATA_BUFFER_LENGTH]; 
... 

有一兩件事 - 我使用的是同一個IO服務寫郵件在收到時(服務器在談論一個老界面,併發出它向所有客戶端收到的消息)以及從客戶端讀取消息。可以使用相同的io服務,導致這種情況發生?

有什麼想法,我應該怎麼做才能解決這個問題?

+1

刪除此 - 在handle_read中是錯誤的。 –

回答

4

你的代碼做它應該做的事 - 它讀取儘可能多的數據。這就是爲什麼功能async_read_some名稱以「some」結尾 - 它讀取「some」字節,並且不承諾做更多的事情。文件還包含以下內容:

考慮使用async_read功能,如果你需要,以確保數據的 請求量的異步操作 完成之前閱讀。

這似乎是你的情況,除非你重新工作你的接收器來處理部分讀取。

+0

好吧 - 我猜我在想什麼,我需要閱讀3個不同長度的輸入消息 - 是否有任何理由,它只是讀取這樣的數量而不是閱讀完整的消息?另外 - 當我使用async_read它不會完全讀取數據(14而不是15),則消息變得不同步(正確讀取下一條消息的第一個字被追加到最後一條消息 - 下一條消息缺少第一個字)和我從來沒有得到一個正確的消息 - 我也在本地主機上測試,所以我不明白爲什麼它的下降數據 –

+0

我也注意到,如果我從客戶端發送一秒鐘的消息,它將最終同步並開始正確閱讀服務器 - 我真的很困惑,爲什麼會出現這種情況 - 然後每隔28或30次出現一次,它會將它乘以256 –

+0

@seanchriste:TCP/IP,尤其是非阻塞讀/寫超出了評論範圍。我可以建議的唯一事情就是寫一本關於它的好書。你不應該能夠發送或接收一個完整的消息,它是一個流媒體協議... – 2012-06-18 14:29:58

相關問題