Как в Debian освободить порт если fuser -k номер/tcp не помогает?
Во время разработки сервера, его приходится часто включать/выключать. Естественно порт освобождается не сразу и сервер не стартует из-а 98-й ошибки EADDRINUSE. Я не хочу использовать SO_REUSEADDR на сокете, просто нужно жёстко закрывать порт и запускать сервер не смотрия ни та что.
fuser -k номер/tcp вроде отрабатывает, но ошибка всё равно остаётся какое-то время, в процессах сервер не висит - закрывается корректно.
Как освободить порт в этом случае?
Ответы (2 шт):
Иногда помогает закрытие сокета извне через ss -K https://unix.stackexchange.com/a/511691/43898 но это в случае если программа не висит в блокировке ввода-вывода.
Как и бывает в большинстве подобных случаев, проблема оказалась в другом...
Разрабатываемый сервер осуществляет коммуникацию с клиентами по WebSocket. Закрытие соединения WebSocket предусматривает обмен закрывающими фреймами. Я тестировал парсинг WS-фрейма, но до корректной обработки закрытия руки не дошли (не отвечал клиенту должным образом и не вычитывал его closure запрос) - в результате сервер то закрывался, а на TCP по этому порту висели данные, отправленные клиентом в пустоту - то ли ping, то ли close запрос. Система не теряла надежды, что их кто-нибудь подберёт, и держала порт...
Как только клиент (в данном эксперименте браузер Firefox) стал получать ответ о закрытии, он корректно отключался, а при перезапуске сервера тот стартовал моментально на том же порте без SO_REUSEADDR, ошибка 88 более не возникала.
Да, решение не является ответом по изначальной тематике вопроса, но пусть оно служит памяткой для подобный проблем - всегда проверять корректность завершения сеанса связи в разрабатываемых приложениях.