2013-03-21 38 views
0

我目前正在使用Boost ASIO在客戶端服務器TCP/IP應用程序上工作。 客戶端使用下面的語句從客戶端接收數據時出現異常 - 「文件結尾」錯誤

boost::system::error_code ignored_error; 
boost::asio::write(socket, boost::asio::buffer("Hello World\0"), ignored_error); 

服務器讀取此數據作爲這樣的將數據發送到服務器(從非同步。讀取)

boost::asio::async_read(*sock, boost::asio::buffer(buf_server),boost::bind(&ServerRead,boost::asio::placeholders::error)); 

這裏就是讀數完成

boost::array<char, 158> buf_server; 

void ServerRead(const boost::system::error_code& error) 
{ 
    if(!error) 
    { 
     std::cout << "Message: " << buf_server.data() << std::endl; 
    } 
    else 
    { 
     std::cout << "Error occurred." << error.message() << std::endl; 
    } 
} 

但是,我收到錯誤「文件結束」。 所以現在我有兩個問題

  1. 我該如何解決這個問題。我在這裏做錯了什麼?

  2. 假設我的buf_server只有5個字符而不是158.我怎樣才能讓我的接收器使用這個緩衝區只讀取整個數據而std::cout呢?

回答

0

當您指示應用程序讀取158個字節但僅發送12個字節時,應該會發生此行爲。要解決此可以發送固定大小的標頭,指示該消息的大小,包括在短耳文檔中的chat client and server例子展示瞭如何實現這一點,從客戶端實例的摘錄:

void handle_connect(const boost::system::error_code& error) 
    { 
    if (!error) 
    { 
     boost::asio::async_read(socket_, 
      boost::asio::buffer(read_msg_.data(), chat_message::header_length), 
      boost::bind(&chat_client::handle_read_header, this, 
      boost::asio::placeholders::error)); 
    } 
    } 

    void handle_read_header(const boost::system::error_code& error) 
    { 
    if (!error && read_msg_.decode_header()) 
    { 
     boost::asio::async_read(socket_, 
      boost::asio::buffer(read_msg_.body(), read_msg_.body_length()), 
      boost::bind(&chat_client::handle_read_body, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     do_close(); 
    } 
    } 

    void handle_read_body(const boost::system::error_code& error) 
    { 
    if (!error) 
    { 
     std::cout.write(read_msg_.body(), read_msg_.body_length()); 
     std::cout << "\n"; 
     boost::asio::async_read(socket_, 
      boost::asio::buffer(read_msg_.data(), chat_message::header_length), 
      boost::bind(&chat_client::handle_read_header, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     do_close(); 
    } 
    } 

可替換地,或使用更多的外來協議such as HTTP你在哪裏閱讀,直到遇到\r\n定界符。

相關問題