我々はバッファを使用ルストstd::net::UdpSocket
からデータを読み込む:UDPソケットから読み取るのにどのサイズのバッファを使うべきですか?
fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
このバッファはどのくらいの大きさにすべきですか?ソケットはストリームかデータグラムですか?
我々はバッファを使用ルストstd::net::UdpSocket
からデータを読み込む:UDPソケットから読み取るのにどのサイズのバッファを使うべきですか?
fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
このバッファはどのくらいの大きさにすべきですか?ソケットはストリームかデータグラムですか?
あなたが使用しようとするかもしれSO_SNDBUF and SO_RCVBUF on Linux sockets、getsockopt(3)
、SO_RCVBUF
、およびSO_SNDBUF
を参照してください、オプションを送信/受信ソケットに一致するバッファサイズを送信/受信します。
また、プロトコル構造とよく一致するバッファサイズを使用できます。
プログラムのバッファサイズが大きいほど、実行するIO呼び出しが少なくなります。ペイロードを複数の独立したメモリ位置からアセンブルする場合は、IO syscallを最小限に抑えるためにscatter/gather IOベクトルを使用することができます。
予想される最大データグラムより大きなサイズを使用する必要があります。そういうわけで、あなたがそのサイズのものを受け取ったら、プロトコルエラーがあり、データが切り捨てられている可能性があることを知っています。
一度に1つのデータグラムを受信します。それはストリームではありません。
はい、バッファのサイズはプロトコル構造と相関するはずです。しかし、私の関数(readイベントを処理する)が呼び出される前に、複数の受信メッセージがシステムのUDPバッファに蓄積することがあります。したがって、どのサイズが十分かを予測することは不可能です。 –
RustでSO_SNDBUFとSO_RCVBUFを取得するにはどうすればよいですか?動的に割り当てられたバッファを使用する場合は、パフォーマンスを悪化させるヒープを使用する必要があります。 –
UDPの場合は、読み取り操作ごとに1つのデータグラムしか受信しないため、複数のデータグラムに分割されたメッセージがない場合は、メッセージサイズに基づいてバッファのサイズを設定する必要があります。 –