Я использую неблокирующий сокет через библиотеку сокетов, которая обертывает Winsock2 API. Функция WSAAsyncSelect()
используется для отправки уведомлений сокета в окно. (Приложение однопоточное).Закрыть сокет без ожидания отправки в suceeed - Winsock2 неблокирующий TCP-сокет
Я пытаюсь достичь следующей цели для открытого клиентского сокета:
- Отправить окончательное сообщение на сервер
- Закройте гнездо и уничтожить окно
Я не хочу сделать блокировку ожидания для сервера ACK
мое последнее сообщение, так как это вводит еще один момент задержки/неудачи для пользователей моего кода. Это не жизненно важное сообщение для моего протокола, просто приятный.
В настоящее время мой код заканчивается вызовом Winsock2 send()
, чтобы отправить окончательное сообщение, а затем звонит closesocket()
. Тем не менее, мой TCP поток (как показано на Wireshark), то выглядит следующим образом:
// Calling send():
Me -> Host: [PSH, ACK]
// Calling closesocket():
Me -> Host: [FIN, ACK]
// Just after that:
Host -> Me: [ACK]
Host -> Me: [ACK]
Host -> Me: [ACK] Len=1380 // A response to my sent packet, that I don't care about
Me -> Host: [RST, ACK]
Host -> Me: [RST]
Host -> Me: [PSH, ACK] // Retransmission of that response
Me -> Host: [RST]
Итак, есть два RST запросы, отправляемые Windows. Я считаю, что это связано с тем, что сокет получает сообщение после отправки FIN
, поэтому он решает, что RST
необходим, но тогда хост интерпретирует это как запрос повторной передачи.
Если я изменить код, чтобы немного подождать, прежде чем вызывать closesocket
, то след выглядит совсем иначе: мой конец просто посылает [FIN, ACK]
, а другой конец посылает [FIN, ACK]
назад и нет РЭК.
Мой вопрос: как я могу аккуратно отключить мой сокет (т. Е. Избегать обмена RST) без блокировки?
Я не уверен, что понимаю; поскольку это неблокирующий сокет, почему окончательное чтение должно быть прочитано блокировкой? –
@HarryJohnston Я уничтожаю модальное окно, которое отправляет уведомления сокета, поэтому невозможно сделать неблокирующее чтение –
Ah. Не могли бы вы скрыть окно и уничтожить его после того, как соединение было чисто закрыто? –