Я использую pythons socket.py для создания соединения с ftp-сервером. Теперь я хочу reset соединение (отправить RST-флаг) и послушать ответ ftp-сервера. (FYI, использующий socket.send('', 'R') не работает, поскольку ОС отправляет флаг FIN вместо RST.)
Отправка reset в сокетном соединении TCP/IP
Ответ 1
Включите опцию сокета SO_LINGER и установите время задержки на 0 секунд. Это заставит TCP прервать соединение, когда он будет закрыт, сбросить данные и отправить RST. См. Раздел 7.5 и пример 15.21 в UNP.
В python:
def client(host, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
s.connect((host, port))
l_onoff = 1
l_linger = 0
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
struct.pack('ii', l_onoff, l_linger))
# send data here
s.close()
Ответ 2
Чтобы отправить RST на TCP-соединение, установите для параметра SO_LINGER
значение true
с нулевым таймаутом, затем закройте сокет. Это сбрасывает соединение. Я не знаю, как это сделать на Python, или действительно ли вы можете это сделать.
Ответ 3
Если вы хотите реализовать свое поведение по подключению, я думаю, вам стоит попробовать Scapy. Это действительно полезная библиотека/инструмент. Он позволяет вам играть с пакетами IP/TCP/UDP/ICMP.