Как в Debian освободить порт если fuser -k номер/tcp не помогает?

Во время разработки сервера, его приходится часто включать/выключать. Естественно порт освобождается не сразу и сервер не стартует из-а 98-й ошибки EADDRINUSE. Я не хочу использовать SO_REUSEADDR на сокете, просто нужно жёстко закрывать порт и запускать сервер не смотрия ни та что.

fuser -k номер/tcp вроде отрабатывает, но ошибка всё равно остаётся какое-то время, в процессах сервер не висит - закрывается корректно.

Как освободить порт в этом случае?


Ответы (2 шт):

Автор решения: eri

Иногда помогает закрытие сокета извне через ss -K https://unix.stackexchange.com/a/511691/43898 но это в случае если программа не висит в блокировке ввода-вывода.

→ Ссылка
Автор решения: Iceman

Как и бывает в большинстве подобных случаев, проблема оказалась в другом...

Разрабатываемый сервер осуществляет коммуникацию с клиентами по WebSocket. Закрытие соединения WebSocket предусматривает обмен закрывающими фреймами. Я тестировал парсинг WS-фрейма, но до корректной обработки закрытия руки не дошли (не отвечал клиенту должным образом и не вычитывал его closure запрос) - в результате сервер то закрывался, а на TCP по этому порту висели данные, отправленные клиентом в пустоту - то ли ping, то ли close запрос. Система не теряла надежды, что их кто-нибудь подберёт, и держала порт...

Как только клиент (в данном эксперименте браузер Firefox) стал получать ответ о закрытии, он корректно отключался, а при перезапуске сервера тот стартовал моментально на том же порте без SO_REUSEADDR, ошибка 88 более не возникала.

Да, решение не является ответом по изначальной тематике вопроса, но пусть оно служит памяткой для подобный проблем - всегда проверять корректность завершения сеанса связи в разрабатываемых приложениях.

→ Ссылка