我有一個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服務,導致這種情況發生?
有什麼想法,我應該怎麼做才能解決這個問題?
刪除此 - 在handle_read中是錯誤的。 –