2011-06-22 33 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。 –