У меня есть сетевое приложение, которое использует широковещательные рассылки UDP для обнаружения устройства, но одновременно принимает только одно соединение. Итак, когда устанавливается новое 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 :: ShareAddress или QUdpSocket :: ReuseAddressHint? Это кажется неправильным, поскольку ни одно из них не описывает действительно нужное мне поведение, а именно, эксклюзивную привязку для моего QUdpSocket во время его существования, и в любом случае QUdpSocket :: ShareAddress должен быть установлен по умолчанию в Windows.
Спасибо,
Стивен.