0

UDP daytime exampleブーストasioチュートリアルから読んでいました。を使用し、recv_buffer_を使用async_receive_from()して受信ループを実行します。

socket_.async_receive_from(
    boost::asio::buffer(recv_buffer_), remote_endpoint_,
    boost::bind(&udp_server::handle_receive, this,
      boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));

わからないのは

boost::array<char, 1> recv_buffer_;

なぜそのサイズは1ですか?メッセージが 1 バイト以上の長さで受信された場合はどうなりますか?

編集

@Guy Sirton が指摘したように、そのページに書かれている hsi の部分を見逃していました。

クライアントのリクエストを格納するために 1 バイトの recv_buffer_ のみを提供するため、クライアントがそれよりも大きなリクエストを送信すると、io_service オブジェクトはエラーを返します。このようなエラーが発生した場合は無視できます。

しかし、バッファサイズなしでメッセージ全体を読む方法はありますか? 文字ごとにループreceive_someして文字列に格納するような?

4

1 に答える 1

3

バッファサイズが必要です。

UDP はメッセージ境界を保持します。データがソケットから読み取られる場合、提供されたバッファーのサイズがメッセージよりも小さい場合でも、メッセージの境界まで読み取られます。メッセージのサイズがバッファのサイズより大きい場合、エラー コードは に設定されboost::asio::error::message_sizeます。

予想される最大メッセージ サイズを読み取るのに十分な大きさのバッファを割り当てるか、リアクタ スタイルの操作を使用して遅延的にバッファを割り当てます。

于 2013-09-03T21:40:41.227 に答える