2009-05-18 2 views
9

VS2008을 디버거로 사용하여 C# 코드에서 Win 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

나는 구글에서 같은 문제를 가진 소수의 사람들을 발견했다. 그러나 나는 이것이 어떻게 해결되는지에 대한 좋은 모범을 발견하지 못했고, 나는 아직도 그것이 일어나는 이유를 이해하지 못한다.

누구나이 문제를 해결하는 방법을 알고 있습니까?

업데이트 :

나는 다른 FTP 계정에 연결을 시도하고 거기에 모두 잘 작동합니다. 따라서 나는 192.168.10.35:21 FTP를 테스트했지만 CuteFTP Pro와 같은 것들에서 잘 작동한다. 이것은 단지 더 이상하게 만듭니다.

답변

7

FTP는 포트 21 이외의 다른 포트를 사용합니다 - 때로는 FTP 모드를 활성에서 수동으로 변경하면 작동하는 데 도움이됩니다. FTP에이 좋은 기사에

reqFTP.UsePassive = false; 

봐 : Active FTP vs. Passive FTP, a Definitive Explanation

+0

차이점을 알고 있지만 수동태에서 능동태로 변경하지 못했지만 누구에게도 좋은 가이드가 있습니까? –

3

티에스는 바로 그것을 가지고, 그것은 코드의 수정이 그렇게 미친 듯이 간단

수동 모드로해야 할 일을했을 :

reqFTP.UsePassive = false; 

그리고 빠르고 오류없이 작동했습니다!

1

COMMAND 포트와 DATA 포트를 구별하는 것이 중요합니다. ACTIVE 또는 PASSIVE 모드에있는 경우에도 연결 프로토콜이 변경됩니다.

MODE ACTIVE :

1) 클라이언트는 기본 서버 COMMAND 포트 (21)에 임의의 불특정 COMMAND 포트 (> 1,023 N)로부터의 접속을 시작. 클라이언트는 그의 DATA 포트 (N + 1)를 지정하고이 포트에서 청취를 시작합니다.

2) 서버는 기본 DATA 포트 (20)에서 지정된 클라이언트 DATA 포트 (N + 1) 로의 연결을 시작합니다.

PASSIVE MODE :

1) 클라이언트는 PASSIVE 명령 기본 서버 COMMAND 포트 (21 무작위로 불특정 COMMAND 포트 (> 1,023 N)의 연결)을 시작. 서버는 임의의 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)로 연결을 시작했습니다.이 포트는 클라이언트의 방화벽에 의해 거부되었을 가능성이 가장 큽니다.

이 정보가 도움이되기를 바랍니다.

관련 문제