在 TCP/IP 套接字连接中发送重置

问题描述 投票:0回答:4

我正在使用 python 的 socket.py 创建到 ftp 服务器的连接。现在我想重置连接(发送 RST 标志)并监听 ftp 服务器的响应。 (仅供参考,使用 socket.send('','R') 不起作用,因为操作系统发送 FIN 标志而不是 RST。)

python sockets networking reset
4个回答
47
投票

打开 SO_LINGER 套接字选项并将延迟时间设置为 0 秒。 这将导致 TCP 在关闭时中止连接、刷新数据并发送 RST。 请参阅 UNIX 网络编程 (UNP) 中的第 7.5 节和示例 15.21。

在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()

3
投票

如果您想通过连接实现自己的行为,我认为您应该尝试使用Scapy。这是一个非常有用的库/工具。它可以让您使用 IP/TCP/UDP/ICMP 包。


3
投票

要在 TCP 连接上发送 RST,请将

SO_LINGER
选项设置为
true
,超时为零,然后关闭套接字。这将重置连接。我不知道如何在 Python 中做到这一点,或者实际上你是否可以做到这一点。


0
投票

连接到服务器,发送数据,然后 RST(而不是 FIN): (我在Windows上测试过)

import struct
from socket import socket, AF_INET, SOCK_STREAM
from _socket import SOL_SOCKET, SO_LINGER

ip="192.168.1.10" #change it to real IP address.
port=8084 #change it to real port number.
s = socket(AF_INET, SOCK_STREAM)
s.setsockopt(SOL_SOCKET, SO_LINGER, struct.pack('ii', 1, 0))
s.connect((ip, port))
#send data to server (optional)
s.close()
© www.soinside.com 2019 - 2024. All rights reserved.