我正在使用 python 的 socket.py 创建到 ftp 服务器的连接。现在我想重置连接(发送 RST 标志)并监听 ftp 服务器的响应。 (仅供参考,使用 socket.send('','R') 不起作用,因为操作系统发送 FIN 标志而不是 RST。)
打开 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()
如果您想通过连接实现自己的行为,我认为您应该尝试使用Scapy。这是一个非常有用的库/工具。它可以让您使用 IP/TCP/UDP/ICMP 包。
要在 TCP 连接上发送 RST,请将
SO_LINGER
选项设置为 true
,超时为零,然后关闭套接字。这将重置连接。我不知道如何在 Python 中做到这一点,或者实际上你是否可以做到这一点。
连接到服务器,发送数据,然后 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()