Перепривязать, используя новый QUdpSocket - PullRequest
0 голосов
/ 14 января 2011

У меня есть сетевое приложение, которое использует широковещательные рассылки 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.

Спасибо, Стивен.

1 Ответ

1 голос
/ 14 января 2011

... иными словами, вопрос ответил сам на себя!

...