Первоначально из: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcbly-kill-established-tcp.html
Чтобы «убить» сокет, вы должны отправить пакет сброса TCP. Чтобы отправить его (и принять другую сторону), вы должны знать фактический порядковый номер TCP.
1) Уже упомянутый tcpkill
метод изучает номер SEQ путем пассивного прослушивания в сети и ожидания получения действительных пакетов этого соединения. Затем он использует полученный номер SEQ для отправки пакетов RSET обеим сторонам. Однако, если соединение неактивно / зависло и данные не передаются, оно ничего не будет делать и будет ждать вечно.
2) Другой метод использует скрипт perl, который называется killcx
( ссылка на Sourceforge ). Это активно отправляет поддельные пакеты SYN и узнает номер SEQ из ответа. Затем он отправляет пакеты RSET так же, как tcpkill
.
Альтернативный подход (основанный на том, чего вы хотите добиться) - использовать gdb
отладчик для подключения к процессу, владеющему этим сокетом / соединением, и close()
выполнять системный вызов от его имени - как подробно описано в этом ответе .
Если вы хотите работать только с зависшими соединениями (другая сторона не работает), существуют различные таймауты (например, TCP keepalive), которые должны автоматически закрывать такие соединения, если в системе правильно настроены.
ss
команды гораздо проще и более общий, чем другие.