Qt の UDPSocket で気をつけること(Windowsの場合)

久しぶりにQt のUDPSocket ではまったのでメモ。

UDPSocket を連続して受信すると、9kbyte 付近で、必ずパケットロスをする現象が発生。パケットキャプチャをする限り、PCまでは届いているので、ソフト的な問題。UDPのバッファの問題か、と思い調べてみるが、Qt の中には、そのようなAPI は存在しない。(UDPSocket のバッファを変更しても無駄でした)

結論としてはSocket のデスクリプタを取得して、setsockopt で、SO_RCVBUF を増やす必要があった。そのため、連続してパケットを受け取ると、デフォルトが 8192 byte のWindowsUDP Socketは、データを落とす、ということらしい。

サンプルコードも書いておきたいが、とりあえず、備忘録で。

Qt で UDP を書いて、なぜかパケットロスがある人は、気をつけるべきだと思う。(ドキュメントに書いておくべきだと思う。ネットで検索しても、解決策が見つからないのも残念な感じ)
まあ、そもそも、Qt は signal/slot でイベントを扱うため、パフォーマンスが出ない、という問題もあるので、そのあたり、注意すべきだよね。