2015-06-25 21 views
2

客戶這樣
垃圾值的boost ::數組::短耳

std::string line; 
    std::cin>>line;  
    boost::asio::write(socket, boost::asio::buffer(line)); 


服務器閱讀這樣

void reader(){ 
      socket_.async_read_some(boost::asio::buffer(buf), 
      boost::bind(&tcp_connection::handle_read,shared_from_this()));  
    } 
void handle_read() 
    { 
      std::cout.write(buf.data(),1024); 
      std::cout<<"\n"; 
    } 
    tcp::socket socket_; 
    boost::array<char, 1024> buf; 


現在,當我寫從客戶端一條線「你好你好」,它只是打印「你好」,然後垃圾值
這裏是服務器顯示輸出:

helloA0�B��B�����a�Pa�!0�B�b����uB�`�#K|BP�b��D4B���Bb�Pa���e��e�����pc�!0�Be���xB�`�#KcBe�:7B�����e��e��� 


怎麼能我從客戶端刪除此垃圾值,並獲得完整的消息/在線

回答

3
  1. operator >>使用空白像scanf()分隔符。你應該使用std::getline()

    std::getline(std::cin, line); 
    
  2. 爲何使用cout.write()?只需使用operator <<

    std::cout << buf.data(); 
    

    當然,你應該在意'\0'-終止。可能boost.asio會將接收到的字節大小提供給您的處理程序。

+0

而垃圾因爲2而顯示出來。您寫入1024個字節,遠遠超過您的消息。 –

+0

@ tsv.dimitrov這就是爲什麼他應該關心''\ 0''。 – ikh

+0

我認爲std :: cout.write()總是會寫入count(第二個參數)字節數,不管是否存在\ 0。 –

3

你有三個問題:

首先,你從緩存寫入1024字節,不管你實際上有多少數據讀取。

其次,TCP連接是,這意味着沒有消息邊界,而導致的可能性,一個接收調用可以得到不到什麼發送,並且需要多個接收接收一個完整的消息。

第三,哪些是由他人回答的,輸入運算符不能按預期工作。