3
アプリケーションでコード例を使用しようとしています。接続クライアントは「hello!」を送信します。サーバーに送信します。サーバーはそれを受信して何らかの形でそれに応答します( "Hi、client!I'm server!")。その後、クライアントと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