Visual Studioのudpでメッセージを受信するプログラムがあります。
UDP REC バッファーがいっぱいの場合、select を使用して、UDP バッファーの使用済みサイズを確認したいと考えています。
この目的で select を使用するにはどうすればよいですか?
例はどこで見ることができますか?
受信バッファがいっぱいであるという事後発見は、何の役にも立たない - パケットはすでにドロップされている. さらに -connect()
またはbind()
の前にバッファ サイズを設定する必要があります。その後は変更されません。
すべきことは、トラフィックの急増に対応できる大きな値にソケット受信バッファを事前に設定し、ネットワーク入力の処理を高速化することです。これは通常、select()
ノンブロッキング ソケット (またはさらに良い -epoll(7)
エッジ トリガー モードの Linux のような高度な API) で実行し、EWOULDBLOCK
.
select()
またはその他のソケット APIを使用しても、UDP パケットを見逃したことを発見することはできません。これは、アプリケーション レベルのプロトコル、つまりトランスポートの 1 層上で行う必要があります。一般的な方法は、アプリケーション メッセージ ヘッダーにシーケンス番号を含めることです。
getsockopt
受信バッファ サイズを含むソケット オプションを取得するために使用できます。setsockopt
サイズを設定するために使用します。
サイズ取得の例:
int size;
getsockopt(socket_fd, SOL_SOCKET, SO_RCVBUF, &size);
std::cout << "Buffer size is currently " << size << " bytes\n";
(TCP とは対照的に) UDP の主な特性の 1 つは、メッセージが失われることがあるということです。それを考慮してプロトコルを設計する必要があります。私は UDP の専門家ではありませんが、バッファーのサイズを確認することがどのように役立つか理解できませんselect
。