2009-05-18 17 views
9

VS2008をデバッガとして使用してC#コードからWindows 2008 ServerにFTP接続しようとすると例外が発生します。C#でFtpWebRequestを使用するポート番号を設定します

私のテストクラスは次のようになります。

public class FTP 
{ 
    private string ftpServerIP = "192.168.10.35:21"; 
    private string ftpUserID = "Administrator"; 
    private string ftpPassword = "XXXXXXXX"; 
    private string uploadToFolder = "uploadtest"; 

    public void Upload(string filename) 
    { 
     FileInfo fileInf = new FileInfo(filename); 
     string uri = "ftp://" + ftpServerIP + "/" + uploadToFolder + "/" + fileInf.Name; 
     FtpWebRequest reqFTP; 

     reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 
     reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
     reqFTP.KeepAlive = false; 
     reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
     reqFTP.UseBinary = true; 
     reqFTP.ContentLength = fileInf.Length; 

     int buffLength = 2048; 
     byte[] buff = new byte[buffLength]; 
     int contentLen; 

     FileStream fs = fileInf.OpenRead(); 
     try 
     { 
      Stream strm = reqFTP.GetRequestStream(); 
      contentLen = fs.Read(buff, 0, buffLength); 

      while (contentLen != 0) 
      { 
       strm.Write(buff, 0, contentLen); 
       contentLen = fs.Read(buff, 0, buffLength); 
      } 

      strm.Close(); 
      fs.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message); 
     } 
    } 
} 

私は、コードを実行すると、私はGetRequestStream()の呼び出しでのFTPエラー227で失敗した接続を取得します。私は、接続を見ることができる例外で は失敗へ:192.168.10.35:52184

私はそれが私はそれがあるべきことをftpServerIPに指定52184. ポートを思い付く方法は考えているポート21

私はGoogleで同じ問題を抱える少数の人物を見つけましたが、これがどのように解決されたかについての良い例は見つかっていません。なぜそれが起こるのかまだ分かりません。

誰でもこの問題を処理する方法を知っていますか?

UPDATE:

私は別のFTPアカウントに接続しようとしていて、そこにすべてが正常に動作します。したがって私は自分の192.168.10.35:21 FTPをテストしましたが、CuteFTP Proなどでうまく動作します。 これはちょっと奇妙になります。

答えて

7

私の推測では、Windowsファイアウォールの問題があります。FTPはポート21以外のポートを使用します。FTPモードをアクティブからパッシブに変更すると、 FTPでこの良い記事で

reqFTP.UsePassive = false; 

ルック:Active FTP vs. Passive FTP, a Definitive Explanation

+0

違いがわかりますが、パッシブからアクティブに変更できないと思いますが、誰かがそれについての良いガイドを持っていますか? –

3

ティエスは右のそれを得たが、それはコード内の修正がとてもめちゃくちゃ簡単です

パッシブモードとしなければならなかった:)

reqFTP.UsePassive = false; 

これは高速でエラーなく動作しました。

1

COMMANDポートとDATAポートを区別することが重要です。接続プロトコルは、アクティブモードまたはパッシブモードの場合にも変わります。

アクティブモード:

1)クライアントは、デフォルトのサーバ・コマンド・ポート(21)にランダム不特定のコマンドポート(> 1023 N)から接続を開始します。クライアントはDATAポート(N + 1)を指定し、このポートでリッスンを開始します。

2)サーバーは、デフォルトのDATAポート(20)から指定されたクライアントDATAポート(N + 1)への接続を開始します。

パッシブモード:

1)クライアントpassiveコマンドでデフォルトサーバのコマンドポートにランダム不特定のコマンドポート(N> 1023)(21)からの接続を開始します。サーバーはランダムDATAポートをオープンし(P> 1023)、それをクライアントに送信します。

2)クライアントは、DATAポート(N + 1)から指定されたサーバーDATAポート(P> 1023)への接続を開始します。

アクティブモードを使用する場合は、クライアントのファイアウォールにサーバーからポートへの接続を受け入れる必要があります(N + 1> 1024)。

この例では、アクティブモードです。クライアントはCOMMANDポート(52183)からサーバーのデフォルトCOMMANDポート(21)への接続を開始し、DATAポート(52184 = 52183 + 1)を指定しました。次に、サーバーはデフォルトのDATAポート(20)からクライアントのDATAポート(52184)への接続を開始しました。これはクライアントのファイアウォールによって拒否された可能性が最も高いです。

私はこれがあなたの問題の解決に役立つことを願っています!

関連する問題