Отправка сброса в сокет TCP / IP - PullRequest
18 голосов
/ 22 июня 2011

Я использую файл python socket.py для создания соединения с ftp-сервером. Теперь я хочу сбросить соединение (отправить флаг RST) и прослушать ответ ftp-сервера. (FYI с использованием socket.send ('', 'R') не работает, так как ОС отправляет флаг FIN вместо RST.)

Ответы [ 3 ]

34 голосов
/ 22 июня 2011

Включите опцию сокета SO_LINGER и установите время задержки на 0 секунд. Это заставит TCP прервать соединение, когда оно закрыто, сбросить данные и отправить RST. См. Раздел 7.5 и пример 15.21 в UNP.

В питоне:

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()
1 голос
/ 22 июня 2011

Чтобы отправить RST по TCP-соединению, установите для параметра SO_LINGER значение true с нулевым таймаутом, затем закройте сокет. Это сбрасывает соединение. Я понятия не имею, как это сделать в Python, и действительно ли вы можете это сделать.

0 голосов
/ 22 июня 2011

Если вы хотите реализовать свое собственное поведение в соединениях, я думаю, вам следует попробовать Scapy . Это действительно полезная библиотека / инструмент. Позволяет играть с пакетами IP / TCP / UDP / ICMP.

...