私はboost :: asioを試していて、ブロッキングエコーの例をテストしました。彼らは完全にそれをブロックしているようには思われません。少なくとも私が期待した方法ではありません。boost :: asioソケットとブロッキングについて
バッファリングの種類を取り除くことは可能ですか、それともできるだけ小さなバッファサイズですか? 10000バイトが小さすぎるようです。
次のコードはブロックする前に2回の書き込みを実行します。 boost :: asio :: transfer_exactly(10000)引数を書き込みに追加しても、それはまだ2です。boost :: asio :: transfer_exactly(5000)は5を書き込みます。
このネットワーク/ io/asioの仕組みはどのように機能しますか?私がちょうど1バイトを送信し、それがもう片方の通信に追加せずに到達するのを待っているかのように。
サーバー:
boost::asio::io_service io_service;
tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), 12346));
tcp::socket sock(io_service);
a.accept(sock);
sock.non_blocking(false);
boost::asio::socket_base::send_buffer_size option(10000);
sock.set_option(option);
while(true) {
char data[10000];
boost::asio::socket_base::bytes_readable bytes_readable_cmd(true);
sock.io_control(bytes_readable_cmd);
std::size_t bytes_readable = bytes_readable_cmd.get();
if(bytes_readable) {
/**/
}
boost::asio::write(sock, boost::asio::buffer(data, 10000));
printf("#\n");Sleep(10);
}
クライアント:
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), "localhost", "12346");
tcp::resolver::iterator iterator = resolver.resolve(query);
tcp::socket sock(io_service);
boost::asio::connect(sock, iterator);
sock.non_blocking(false);
なぜデータを送信し、相手側で受信するまで待つのですか? –
受信者プログラムが実際にデータを取得して処理しているかどうかは気にしないとします。 TCPプロトコルが私に何を提供しているのかだけを知りたい。だから私はasioの 'send'/'write'ブロックが 'recv'と呼ばれるレシーバーまで期待していた。 asioがそれをシーンの後ろで違って処理するなら、それは大丈夫です。私はただ好奇心が強い。 – Ivarpoiss