У меня есть «Поток передачи», который управляет сокетом (#include WinSock2.h) для передачи всех данных UDP, необходимых моему приложению. Приложение является приложением c ++ Windows, работающим на Windows 10. Я отправляю до 5 или около того пакетов в секунду на широковещательный адрес su bnet, каждый пакет менее 200 байтов.
проблема в том, что когда я отключаю Ethe rnet, в буфере записи сокета, похоже, есть некоторые не отправленные данные, которые я не смог вывести sh.
Когда мое приложение обнаруживает потерю rnet, я закрываю (closesocket) и снова открываю сокет. Сразу после повторного подключения сокет отправляет несколько старых сообщений, которые были «отправлены», когда Ethe rnet был отключен.
Я думаю, что эта проблема находится за пределами моего приложения. Я отключил ethe rnet во время работы приложения, а затем закрыл приложение. Сразу после повторного подключения я вижу, что некоторые сообщения передаются, несмотря на то, что приложение больше не работает.
Вещи, которые я пытался (без удачи):
Я пытался вызвать shutdown( m_sock, SD_BOTH );
непосредственно перед closesocket( m_sock );
Я пытался записать буфер, полный нулей, в сокет непосредственно перед закрытием
Я не могу установить параметр SO_DONTLINGER
, потому что мой сокет SOCK_DGRAM
Когда я пытаюсь WSAIoctl( m_sock, SIO_FLUSH, NULL, 0, NULL, 0, &dwBytesRead, &wsol, NULL )
, он возвращает ошибку 997 (WSA_IO_PENDING)
Я не знаю, как остановить ожидание ввода-вывода.
Ни WSASendDisconnect( m_sock, NULL )
, ни CancelIo( (HANDLE)m_sock )
не работают, и ни один не сигнализирует об ошибке