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);
}
我怕我忘了什麼事,關閉(如插座)。但無論如何 - 和想法?
您的回寫被註釋掉了,但即使如此,服務器也不會嘗試執行寫入操作,直到客戶端斷開連接後纔會執行寫操作,因爲只有在收到錯誤讀數時纔會斷開'for(;;)'。你到底在期待什麼? – Chad
沒錯。這樣呢? –
在您的服務器設置中,將接受單個連接的'acceptor'。建立連接後,服務器將使用'read_some()'函數從連接的應用程序讀取數據,直到該連接關閉。一旦該連接關閉,服務器將嘗試使用write()將數據寫回到客戶端。只有這樣服務器才能接受其他連接。這些似乎與您對預期行爲的描述不符。 – Chad