Python: как внезапно отключить сокет, не закрывая его соответствующим образом

У меня есть тестовая программа Python для тестирования функций другого программного компонента, позвольте последнему тестировать компонент (COT). Программа тестирования Python подключается к COT через постоянное TCP-соединение. Программа Python использует для этого API сокетов Python. Теперь, чтобы имитировать отказ физической ссылки, я хотел бы, чтобы программа Python закрывала сокет, но не отключая его соответствующим образом. То есть я больше не хочу, чтобы что-то было отправлено по каналу TCP, включая TCP SYN/ACK/FIN. Я просто хочу, чтобы сокет молчал. Он больше не должен отвечать на удаленные пакеты.

Это не так просто, как кажется, поскольку вызов close в сокете отправит TCP FIN пакеты на удаленный конец. (изящное отключение). Итак, как я могу убить сокет без отправки каких-либо пакетов?

Я не могу закрыть программу Python, потому что ей нужно поддерживать другие подключения к другим компонентам. Для информации, сокет работает в отдельном потоке. Поэтому я подумал о внезапном убийстве потока, но это тоже не так просто. (Есть ли способ убить поток в Python?)

Любые идеи?

Ответ 1

Вы не можете сделать это из процесса пользователя, так как в ядре сети все еще хранятся ресурсы и состояние, связанное с данным TCP-соединением. Событие, если вы убьете весь процесс, ядро ​​отправит FIN на другую сторону, так как он знает, какие дескрипторы файлов имеют ваш процесс, и попытается их правильно очистить.

Один из способов обойти это - задействовать программное обеспечение брандмауэра (на локальной или промежуточной машине). Вызовите script, который сообщает брандмауэру о сбросе всех пакетов с/на заданный IP и порт (что, конечно же, потребует соответствующих административных привилегий).

Ответ 2

В отличие от ответа Николая, действительно существует путь к reset соединению из userland, так что RST отправляется и отложенные данные отбрасываются, а не FIN после всех ожидающих данных. Однако, поскольку он более жесток, чем используется, я не буду публиковать его здесь. И я не знаю, можно ли это сделать с Python. Установка одной из трех возможных конфигураций SO_LINGER и закрытия будет делать это. Я не буду говорить больше, и я скажу, что этот метод должен использоваться только для цели, изложенной в вопросе.