2011-06-22 30 views
13

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

+1

为什么你要重置连接? – EJP

+3

复制恶意ftpclient – Anvay

+0

你是什么意思“重置连接”?在TCP/IP'RST'标志中? –

回答

0

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

1

要在TCP连接上发送RST,请将SO_LINGER选项设置为true,并且超时时间为零,然后关闭套接字。这会重置连接。我不知道如何在Python中做到这一点,或者甚至是否可以做到这一点。

24

打开SO_LINGER插座选项并将延迟时间设置为0秒。这将导致TCP在关闭时中止连接,刷新数据并发送RST。参见UNP中的第7.5节和第15.21节。

在蟒蛇:

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

它会导致TCP在关闭时中止连接,*丢弃*任何未决数据,并发送RST。 – EJP

+3

对于那些好奇的人来说,有一些更多的信息:SO_LINGER的时间为0秒意味着TCP堆栈不会在close()周围“流连忘返”:它将丢弃任何未发送的数据并发送RST而不是FIN。欲了解更多信息,请阅读[this](http://developerweb.net/viewtopic.php?id=2982)和[this](http://www.pcvr.nl/tcpip/tcp_conn.htm)。 –

+0

请注意,如果您在Microsoft Windows环境中使用此代码,则需要用“hh”替换对struct.pack()的调用中的'ii'。 Windows在struct linger中使用短裤,Linux使用ints。 –