0

Linux 用の小さなコマンドライン FTP クライアントを C で作成する必要があります。一般的な用途 (ディレクトリの管理、ファイルの取得と保存など) では非常にうまく機能し、アクティブ モードを追加したいと考えています (現時点ではすべての転送がパッシブモードで作成)。
次の形でコマンドを送信する必要があることはわかっています。

PORT a,b,c,d,e,f

a b c dIP アドレス ブロックとe fポート番号はどこにありますか。ただし、私が理解しているように、IPはクライアントが実行されているマシンのIPである必要がありますが、getsockname(). 私がテストしgetsockname()たことから、インターネットから見たIPではなく、ソケットで使用されるインターフェースのローカルIPを取得します。したがって、サーバーが接続するためにこのIPアドレスを与えることはできません。

問題は、コマンドPORTを正しく理解しているか、それを送信するための正しい IP を取得する方法です。

4

2 に答える 2

1

FTP アクティブ モードとは、サーバーがクライアントへの接続を開き、データ自体を送信することを意味します。多くの場合、これは実用的ではないため、パッシブ モードが発明されました。サーバーは、着信接続をリッスンし、誰かが接続されたときに送信を開始する追加のポートを開きます。

したがって、パッシブ モードのセッションは次のようになります。

$ telnet localhost 21
220 Welcome to EarlGray FTP
USER ftp
331 Please specify the password.
PASS ftp
230 Login successful.
PASV 
227 Entering Passive Mode (127,0,0,1,185,37).
LIST
150 Here comes the directory listing.
            ---> here client opens another telnet session, 
            ---> connecting to the same server on port 185*256+37, specified by server:
              $ telnet localhost $((185 * 256 + 37))
              Trying 127.0.0.1...
              Connected to localhost.
              Escape character is '^]'.
              drwxrwxr-x    2 121      1003         4096 Aug 21 10:57 incoming
              drwxrwxr-x    7 0        1003         4096 Nov 09 21:04 pub
              Connection closed by foreign host.
            <---- end of data transfer session

226 Directory send OK.

一方、アクティブなセッションの例:

$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Welcome to EarlGray FTP
USER ftp
331 Please specify the password.
PASS ftp
230 Login successful.
PORT 127,0,0,1,45,45                      (ports are specified by client)
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.

        ---> here client listens for an incoming connection on port 45*256+45
          $ nc -l 0.0.0.0 $((45 * 256 + 45))
          drwxrwxr-x    2 121      1003         4096 Aug 21 10:57 incoming
          drwxrwxr-x    7 0        1003         4096 Nov 09 21:04 pub
        <--- data are rececived

226 Directory send OK.

PS FTP は非常に古いプロトコル (1970 年頃の定義) であり、ルーター、ゲート、およびその他のトランスポート レベルのグッズが存在しなかったときに定義されました。通常、複数のマシンが直接接続されていたため、アクティブ モードは非常にうまく機能し、パッシブ モードはどのように機能したかを示しています。プロトコルは今日も生き残っています。

したがって、はい、PORT コマンドを正しく取得しましたが、外部 IP を取得するための統一された方法はありません (ローカル マシン上のいくつかの異なるネットワークに複数の IP が存在する可能性があります。どのサーバーを使用しますか?)。質問の 2 番目の部分である、サーバーから見た IP を取得する方法については、答えられません (これがパッシブ モードの目的です)。

于 2012-11-20T20:29:07.060 に答える
0

NATの背後にいる場合は、エンドツーエンドの原則を破るのはNATの責任です^ W ^ W ^ W ^WNATPORT/226コマンド/応答のアドレス。そのNATはFTPを明示的にサポートする必要があります。

于 2012-11-20T20:15:38.300 に答える