2011-06-22 23 views
13

私はftp-serverへの接続を作成するためにpythonのsocket.pyを使用しています。今私は接続をリセットする(RSTフラグを送信する)と、FTPサーバーの応答を聞いてみたい。 (OSがソケットのRSTの代わりにFINフラグを送信するので、socket.send( ''、 'R')を使用するFYIは機能しません)。TCP/IPソケット接続でリセットを送信する

+1

は、なぜあなたは、接続をリセットしたいですか? – EJP

+3

悪意のあるftpクライアントを複製する – Anvay

+0

「接続をリセットする」とはどういう意味ですか? TCP/IPの 'RST'フラグのように? –

答えて

0

接続上で独自の動作を実装する場合は、Scapyを試してください。これは本当に便利なライブラリ/ツールです。それはIP/TCP/UDP/ICMPパッケージで遊ぶことを可能にする。

1

TCP接続でRSTを送信するには、SO_LINGERオプションをtrueに設定してタイムアウトをゼロにしてから、ソケットを閉じます。これにより、接続がリセットされます。私はPythonでそれをどうやって行うのか、実際にあなたがそれを行うことができるかどうかはわかりません。

24

SO_LINGERソケットオプションをオンにして、リンガー時間を0秒に設定します。これにより、TCPが閉じられたときに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() 
+2

これは、TCPがクローズ時に接続を中止し、保留中のデータをすべて破棄してRSTを送信するようにします。 – EJP

+3

好奇心が強い人のためのちょっとした情報:SO_LINGERの時間が0秒のとき、TCPスタックはclose()に「残っていない」ことを意味します:未送信のデータを破棄し、FINの代わりにRSTを送信します。詳細については、[this](http://developerweb.net/viewtopic.php?id=2982)と[this](http://www.pcvr.nl/tcpip/tcp_conn.htm)を参照してください。 –

+0

Microsoft Windows環境でこのコードを使用している場合は、struct.pack()の呼び出しで 'ii'を 'hh'に置き換える必要があることに注意してください。 Windowsではstruct lingerのshortを使用していますが、Linuxではintを使用しています。 –

関連する問題