2

.NET 4.0 を使用してカスタム FTP サーバーを作成しました。クライアントとサーバーの両方を同じ Windows 7 マシンで実行していますが、ファイアウォールは完全に無効になっています。FileZilla と FtpUse の両方を使用して接続し、PASV モードを確立して、フォルダの内容を問題なく参照できます。Windows Explorer 経由で接続しようとすると、問題が発生します。正常にログインできますが、Explorer が PASV コマンドを送信すると (以下のクライアント/サーバー交換を参照)、Explorer は「FTP フォルダー エラー」というメッセージ ボックスをポップアップ表示します。そのフォルダにアクセスする権限があります。」以下の詳細は、サーバーから受信した最後の 2 つの応答です。これを見つけました ( http://support.microsoft.com/kb/2754804/en-us)更新してインストールしましたが、役に立ちませんでした。誰でもこれが何であるか考えていますか? PASVコマンドのレスポンスを返す前にTCPリスナを開いているので、タイミングの問題ではないと思います。

<< 220 ***********.
>> USER Domain\******
<< 331 Password required.
>> PASS *******
<< 230 Domain\****** logged in.
>> opts utf8 on
<< 200 OPTS UTF8 command successful - UTF8 encoding now on.
>> syst
<< 215 Windows_NT.
>> site help
<< 200
<< 200 End of help.
>> PWD
<< 257 "/".
>> TYPE A
<< 200 Type set to A.
>> PASV
<< 227 Entering Passive Mode (10,0,0,4,7,100)
4

1 に答える 1

2

もともと、私は問題がに関連している可能性があると思っていました

PASV コマンドの後、Windows エクスプローラーが FTP 接続を切断する

しかし、パッシブポートを事前に開いてみましたが、役に立ちませんでした。代わりに、問題は Windows エクスプローラーの厳密さに関連しています。227 応答の一部として提供される IP アドレスは、クライアントが最初に接続した FTP サイトのアドレスと同じでなければなりません。つまり、クライアントが次を使用して接続する場合

ftp://localhost 

(これは 127.0.0.1 に解決されます)、PASV 応答で提供される IP アドレスは 127.0.0.1 である必要があります。そうでない場合、Windows エクスプローラーでエラーが発生します。これは、IPAddress.Any でパッシブ ポートを開くことができないということではありません。次のことが可能です。

var listener = new TcpListener(IPAddress.Any, 0)

ただし、結果とともに返されるアドレスは 127.0.0.1 である必要があります (上記を例として使用)。クライアントが最初にマシンの IP、たとえば 10.xxx に接続する場合、227 応答で返される IP アドレスも 10.xxx である必要があります。

FileZilla はどういうわけかもっと寛容でなければなりません。

于 2014-01-06T21:10:42.217 に答える