Закрытие сокета с помощью SO_LINGER не отправляет пакет RST
При закрытии TCP-соединения с клиентом клиентское приложение будет визуально отвечать пользователю только при сбросе соединения (отправляется RST-пакет). На данный момент я не могу изменять клиентское приложение.
Изучая это, основной способ сделать это - включить SO_LINGER с временем задержки 0. Однако я заметил, что сокет закрывается, как ожидалось (например, не остается в TIME_WAIT в течение системного времени по умолчанию), но не отправляет пакет RST клиенту.
Я протестировал это в WSL2 и Ubuntu (как собственная виртуальная машина, а не часть WSL), и оба не отправили ожидаемый пакет.
Серверный сокет (тот, который listen()
s), включена опция SO_REUSEADDR и клиентский сокет (тот accept()
ed) имеет соответствующий параметр SO_LINGER, а также TCP_NODELAY.
Следует отметить, что сервер создает поток для каждого принятого сокета. Я не уверен, повлияет ли это на проблему. Я также пробовал некоторые решения, которые другие опубликовали в других вопросах, но ни одно из них не помогло.
Иногда я вижу, что RST-файлы в wirehark отправляются после нескольких запусков сервера (когда я обновляю код и еще много чего), но они не отправляются немедленно, когда они закрываются или когда процесс завершается.
Может ли какой-либо из перечисленных выше фактов быть причиной того, что пакет RST не отправляется, или есть ли системный параметр Linux, который необходимо изменить для этого?
Заранее спасибо. Сообщите мне, если потребуется дополнительная информация.