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

Anv*_*vay 18 python sockets networking reset

我使用python的socket.py来创建到ftp-server的连接.现在我想重置连接(发送RST标志)并监听ftp-server的响应.(使用socket.send('','R')的FYI不起作用,因为OS发送FIN标志而不是RST.)

cro*_*ent 36

打开SO_LINGER套接字选项并将延迟时间设置为0秒.这将导致TCP在关闭时中止连接,刷新数据并发送RST.参见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()
Run Code Online (Sandbox Code Playgroud)

  • 对于那些好奇的人来说,还有一些信息:SO_LINGER的时间为0秒意味着TCP堆栈不会在close()上"徘徊":它将丢弃任何未发送的数据并发送RST而不是FIN.有关更多信息,请阅读[this](http://developerweb.net/viewtopic.php?id=2982)和[this](http://www.pcvr.nl/tcpip/tcp_conn.htm). (6认同)
  • 它将导致TCP在关闭时中止连接,*丢弃*任何未决数据,并发送RST. (4认同)
  • 请注意,如果您在Microsoft Windows环境中使用此代码,则需要将对struct.pack()的调用中的“ ii”替换为“ hh”。Windows使用struct linger中的短裤,而Linux使用ints。 (2认同)

San*_*dri 3

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