3

現在、boost::async_write を使用して大きなサイズのバッファ (約 50KB) を一度に送信しています。その結果、サーバー側の 20 バッファーごとに約 1 つの破損したバッファーを受信して​​います。

私のコードはこのようなものです。エラー処理とその他の詳細は省略されています。

bool socket_available = true;
const_buffer *buffer;

// will be called frequently in a while loop in thread A
void send_buffer()
{
    scope_lock l(mutex);
    if (!socket_available) return;

    socket_available = false;
    buffer = get_buffer_for_send();   // The size is about 50KB
    boost::asio::async_write(
        socket, buffer,
        boost::bind(handle_write_request, boost::asio::placeholders::error)
    );
}

// will be called in thread B which runs io_service::run
void handle_write_request(const boost::system::error_code& error_code)
{
    scope_lock l(mutex);
    socket_available = true;
    free_buffer(buffer);
}

ハンドラーが呼び出された後に async_write を 1 回だけ呼び出すため、async_write を正しく使用していると思います ( http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/async_write/overload1.html)。ただし、データは送信中にインターリーブされているように見えます。

そのようなことを行う一般的な方法は、async_write をハンドラーに入れて、両方が 1 つのスレッドで呼び出されるようにすることです。そして、私がこれを行っているとき、データの破損は二度と起こりません. したがって、上記のコードが期待どおりに機能しない理由を知りたいと思っています。

お時間とアドバイスをありがとう。ところで、win 7 でブースト 1.54.0 を使用しています。

4

1 に答える 1

1

送信は非同期であるため、バッファは全期間にわたって無傷のままでなければなりません。たとえば、グローバル変数の使用は正しくありません。同時に 2 つの送信を行うとどうなりますか? また、get_buffer_for_send()表示されていませんが、問題も含まれている可能性があります。

于 2013-08-22T11:01:08.873 に答える