2011-09-14 21 views
3

我試圖在我的應用程序中使用代碼示例。在一個連接客戶端發送「你好!」到服務器。服務器收到它並以某種方式回答(並以「嗨,客戶端!我是服務器!」結束消息) - 但這就是我所擁有的:服務器在我通過telnet連接到它併發送內容之前不會收到任何內容。之後,它接收(打印)客戶端和遠程登錄消息。Boost :: asio:只有在出現其他連接後纔會收到數據

客戶:

socket.connect(tcp::endpoint(tcp::v4(), 21), error); 
if (error) 
    throw boost::system::system_error(error); 
boost::asio::write(socket, boost::asio::buffer("Hello!\n"), boost::asio::transfer_all(), ignored_error); 
for (;;) 
{ 
    boost::array<char, 128> buf; 
    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. 

    std::cout.write(buf.data(), len); 
} 

服務器:

for (;;) 
{ 
    tcp::socket socket(io_service); 
    acceptor.accept(socket); 
    for (;;) 
    { 
     boost::array<char, 128> buf; 
     boost::system::error_code error; 
     size_t len = socket.read_some(boost::asio::buffer(buf), error); 

     if (buf[len-1] == '/n') 
      break; // Connection closed cleanly by peer. 
     else if (error) 
      throw boost::system::system_error(error); // Some other error. 
     std::string a(buf.data()); 
    } 

    std::string message = make_daytime_string(); 
    boost::system::error_code ignored_error; 
    boost::asio::write(socket, boost::asio::buffer("Hi, client! I'm server!"), 
    boost::asio::transfer_all(), ignored_error); 
} 

我怕我忘了什麼事,關閉(如插座)。但無論如何 - 和想法?

+0

您的回寫被註釋掉了,但即使如此,服務器也不會嘗試執行寫入操作,直到客戶端斷開連接後纔會執行寫操作,因爲只有在收到錯誤讀數時纔會斷開'for(;;)'。你到底在期待什麼? – Chad

+0

沒錯。這樣呢? –

+0

在您的服務器設置中,將接受單個連接的'acceptor'。建立連接後,服務器將使用'read_some()'函數從連接的應用程序讀取數據,直到該連接關閉。一旦該連接關閉,服務器將嘗試使用write()將數據寫回到客戶端。只有這樣服務器才能接受其他連接。這些似乎與您對預期行爲的描述不符。 – Chad

回答

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

if (buf[len-1] == '/n') 

您所做約tcp::ip::socket::read_some()一些假設是not true

備註

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

我建議您使用read()free function作爲文檔建議。

相關問題