2017-06-07 85 views
0

WinInetを使用してFTPサーバーに接続します。私はFtpCommand()を使用して、アクティブモードからパッシブモードに切り替えるための "PASV"コマンドを送信します。私は今パッシブモードからアクティブモードに切り替える反対のコマンドを探しています。誰もこれを行う方法を知っていますか?WinInet FTPスイッチ接続中にアクティブモードにパッシブしますか?

+0

なぜこの質問はC++とタグ付けされていますか? – Dai

+0

なぜ質問にマイナス?私はftp接続のためにC++を使います。私はあなたが同じプログラム言語で質問していると確信している場合は、私は確信しています...そして、あなたが答えをよく知っていない場合は、他の質問を汚さないでください... – Vas

+0

C++で質問にタグを付けると、いくつかのC++コード。それは完全にはっきりしていません。最初からC++でFTPクライアントを実装していますか? –

答えて

2

アクティブモードは、PASV(またはEPSV)コマンドを送信する代わりにPORT(またはEPRT)コマンドを送信すると有効になります。 PORT/EPRTは、システムにアクティブに接続する必要のあるIP /ポートをサーバに通知します。

FTPプロトコルの仕組みを理解したい場合は、FTP仕様、RFC 959、およびそのさまざまな拡張子、特にRFC 2428RFC 3659を読むことをお勧めします。

WinInetでは、通常、転送モードは、InternetConnect()またはInternetOpenUrl()を呼び出すと、セッションの開始時に確立されます。 INTERNET_FLAG_PASSIVEフラグを指定すると、パッシブモードが強制されます。フラグを指定しない場合、モードはユーザーのデフォルトのインターネットオプションによって決まります。このモードでは、FtpGetFile()/FtpPutFile()FtpFindFirstFile()/InternetFindNextFile()関数は、それぞれ独自のデータ接続で機能します。セッションのモードが確立されると、AFAIKは変更できません。

ただし、PASV/EPSVPORT/EPRT含めて、手動で任意のFTPコマンドを送信するためにFtpCommand()を使用することができます。 fExpectResponseパラメータをTRUEに設定すると、データソケットが作成された場合、phFtpCommand出力パラメータで新しいHINTERNETハンドルが得られます。そのハンドルを使用してInternetReadFile()InternetWriteFile()とすると、そのデータ接続を介してファイルとディレクトリのリストを転送できます。

+0

本当に、私はフラグを指定せずにwininetとinternetconnect()を使用していますが、ローカルでテストした結果、ftpコマンドと "PASV"オプションでパッシブモードに入ることができます。 (私は決してそれをオンラインサーバーにテストしたことはありません)EPRTコマンドmabyで同じことを試してみてください。 (私は後でオンラインサーバ上のこれらの2つのオプションをチェックし、何が起こっているかを見るでしょう)。新しいオプションに再接続すると、接続中に変更できない – Vas

関連する問題