私は、デバイスの検出にUDPブロードキャストを使用するネットワークアプリケーションを持っていますが、一度に1つの接続しか受け付けません。したがって、新しいTCP接続が行われると、私は発見に使用されたQUdpSocketを削除します。新しいQUdpSocketを使用して再バインド
// Set up a UDP server to respond to any "discovery" messages:
udpServer = new QUdpSocket(this);
if (udpServer -> bind(QHostAddress::Any, DISCOVERY_PORT))
connect(udpServer, SIGNAL(readyRead()),
this, SLOT(beDiscovered()));
else
{
fprintf(stderr, "UDP port not bound successfully: %d, ", udpServer ->error());
fprintf(stderr, udpServer ->errorString().toLocal8Bit());
fprintf(stderr, "\r\n");
fflush(stderr);
#ifdef WIN32
_commit(_fileno(stderr));
#else
fsync(_fileno(stderr));
#endif
}
再バインドが失敗した、しかし、コード8で、「バインドされたアドレスが既にある:リモートデバイスが、私は新しいQUdpSocketを作成して、再び待機を開始したい、切断されしかし
、使用中で"。
「古い」QUdpSocketが削除されたときに、バインドされたアドレスを完全に解放するにはどうすればよいでしょうか?
私はQUdpSocket :: ShareAddressまたはQUdpSocket :: ReuseAddressHintとバインドする必要がありますか?これは正しいとは思えません。本当に私が望む振る舞い、つまり自分の生存期間中の私のQUdpSocketに対する排他的な結びつき、そしていずれにしてもQUdpSocket :: ShareAddressがWindowsのデフォルトであると思われるからです。
ありがとう、 スティーブン。
私はちょうど何かに気づいた。上に引用したコードはQtの "スロット"内にあります。リモートホストが切断されると、スロットは連続して2回呼び出されます。初めてUdpSocketが正しく設定されたように見えるので、同じポインタを使用して別の新しいQUdpSocketを2回目に作成し、これをバインドできません。ほとんど驚くことではありません。 –
上記のコードを "if(!udpServer)"ブロックで囲むことで問題は解決しましたが、今は偽信号がどこから来ているのかを知る必要があると思います。 –