2016-03-31 10 views

答えて

0

あなたが使用しようとするかもしれSO_SNDBUF and SO_RCVBUF on Linux socketsgetsockopt(3)SO_RCVBUF、およびSO_SNDBUFを参照してください、オプションを送信/受信ソケットに一致するバッファサイズを送信/受信します。

また、プロトコル構造とよく一致するバッファサイズを使用できます。

プログラムのバッファサイズが大きいほど、実行するIO呼び出しが少なくなります。ペイロードを複数の独立したメモリ位置からアセンブルする場合は、IO syscallを最小限に抑えるためにscatter/gather IOベクトルを使用することができます。

+0

はい、バッファのサイズはプロトコル構造と相関するはずです。しかし、私の関数(readイベントを処理する)が呼び出される前に、複数の受信メッセージがシステムのUDPバッファに蓄積することがあります。したがって、どのサイズが十分かを予測することは不可能です。 –

+0

RustでSO_SNDBUFとSO_RCVBUFを取得するにはどうすればよいですか?動的に割り当てられたバッファを使用する場合は、パフォーマンスを悪化させるヒープを使用する必要があります。 –

+1

UDPの場合は、読み取り操作ごとに1つのデータグラムしか受信しないため、複数のデータグラムに分割されたメッセージがない場合は、メッセージサイズに基づいてバッファのサイズを設定する必要があります。 –

1

予想される最大データグラムより大きなサイズを使用する必要があります。そういうわけで、あなたがそのサイズのものを受け取ったら、プロトコルエラーがあり、データが切り捨てられている可能性があることを知っています。

一度に1つのデータグラムを受信します。それはストリームではありません。