私はboost asioでソケットプログラミングに問題があります。boost asio async_read delay(ローカルソケット)
私のプログラムの流れは以下の通りです:サーバーにデータを送信するために
クライアントの利用async_write、それがサーバーからデータを受信するためにasync_readを使用します。非同期操作のハンドラはすべてuse_futureであり、タイムアウトは2秒です。
問題があります。サーバーの
処理時間は約10ミリ秒です。サーバーとクライアントの両方が同じコンピューターにあるため、サーバーはサーバーがデータを送信している間にクライアントにデータを受け取る必要があります。しかし、私はasync_readのレイテンシを測定しました。そのうちのいくつかは約10ミリ秒で、他は約30〜40ミリ秒でした。通常、それらはインターリーブされます。
はどのようにして測定を実行します。
- を後押しする:: ASIO ::ストリームバッファを大きなスペースを割り当て:
auto start_time = std::chrono::steady_clock::now(); auto read_result = async_read(..., use_future); auto read_future_status = read_result.wait_for(timeout); auto end_time = std::chrono::steady_clock::now();
私は2つのソリューションを試してみました。私は4096バイトを割り当て、データサイズは1500バイトを超えることはありませんが、動作しません。
socket_.set_option(ip::tcp::no_delay(true));
を使用すると、Nagle's AlgorithmとDelay Ackがオフになります。また、動作しません。
私はこの問題について考えていません。誰でも私を助けることができますか?してください...
アップデート:ここに私のソースコードの下
の部分があるサーバへの送信要求のコードです:
以下auto send_result = async_write(input_socket, out_buffer, use_future);
auto send_status = send_result.wait_for(std::chrono::seconds(timeout));
if(send_status == std::future_status::timeout)
{
LOG4CPLUS_ERROR_FMT(logger_, "send %s future error : (%d).", action, send_status);
}
out_buffer.consume(request.length());
は、サーバからデータを受信するコードです。
auto read_buffer_result = async_read(output_socket, in_buffer, transfer_exactly(sizeof(Header)), use_future);
auto read_status = read_buffer_result.wait_for(std::chrono::seconds(timeout));
if(read_status == std::future_status::timeout)
{
LOG4CPLUS_ERROR_FMT(logger_, "read %s header future error : (%d).", action, read_status);
}
size_t byte_transferred = read_buffer_result.get();
in_buffer.consume(byte_transferred);
コード –
...またはさらに完全な(短い!)例 –
を返信いただきありがとうございます。私はソースコードを投稿しようとします。 – CenaWang