2009-05-18 26 views
9

Recibo una excepción cuando intento enviar un FTP a mi Win 2008 Server desde el código C# utilizando VS2008 como depurador.Establezca el número de puerto al usar FtpWebRequest en C#

Mi clase de prueba es el siguiente:

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); 
     } 
    } 
} 

Cuando ejecuto el código recibo un Error de conexión con el error FTP 227 en la llamada GetRequestStream(). En la excepción puedo ver la conexión falla a: 192.168.10.35:52184

no tengo ni idea de lo que viene con el puerto 52184. especifico en el ftpServerIP que debería ser el puerto 21.

He encontrado algunas personas con los mismos problemas en Google, pero no he encontrado un buen ejemplo de cómo se resuelve esto y todavía no entiendo por qué sucede.

¿Alguien sabe cómo manejar este problema?

ACTUALIZACIÓN:

he tratado de conectarse a una cuenta FTP diferente y no todo funciona bien. Por lo tanto, probé mi FTP 192.168.10.35:21 pero funciona bien en CuteFTP Pro y me gusta. Esto lo hace aún más extraño ...

Respuesta

7

Supongo que habrá problemas con el firewall de Windows, FTP usa otros puertos aparte del puerto 21 - a veces cambiar el modo FTP de activo a pasivo ayuda a que las cosas funcionen.

reqFTP.UsePassive = false; 

mirada a este buen artículo sobre FTP: Active FTP vs. Passive FTP, a Definitive Explanation

+0

Creo que veo la diferencia, pero no puedo pasar de Pasivo a Activo, ¿alguien tiene una buena guía para eso? –

3

Thies lo hizo bien, tenía que ver con el modo pasivo

El arreglo en el código es tan increíblemente sencilla :)

reqFTP.UsePassive = false; 

¡Y funcionó rápido y sin errores!

1

Es importante diferenciar el puerto de COMANDO y el puerto de DATOS. El protocolo de conexión también cambiará dependiendo de si está en modo ACTIVO o PASIVO.

modo activo:

1) El cliente inicie una conexión de un puerto COMANDO no especificado aleatorio (N> 1023) al puerto de comando de servidor por defecto (21). El cliente especificará su puerto de DATOS (N + 1) y comenzará a escuchar en este puerto.

2) El servidor inicia una conexión desde su puerto de datos predeterminado (20) al puerto de datos del cliente especificado (N + 1).

modo pasivo:

1) El cliente inicia una conexión desde un puerto aleatorio no especificado COMANDO (N> 1023) al puerto de comandos del servidor por defecto (21) con el comando pasiva. El servidor abre un puerto de DATOS aleatorio (P> 1023) y lo envía al cliente.

2) El cliente inicia una conexión desde su puerto de DATOS (N + 1) al puerto de DATOS del servidor especificado (P> 1023).

Si usa el modo ACTIVE, lo más probable es que necesite permitir que el firewall de su cliente acepte la conexión del servidor a su puerto (N + 1> 1024).

En su ejemplo, usted estaba en modo ACTIVO. Su cliente inició una conexión desde su puerto COMMAND (52183) al puerto COMMAND predeterminado del servidor (21) y especificó su puerto DATA (52184 = 52183 + 1). Luego, el servidor inició una conexión desde su puerto de datos predeterminado (20) al puerto de datos del cliente (52184) que probablemente fue rechazado por el firewall del cliente.

¡Espero que esto lo ayude a resolver su problema!

Cuestiones relacionadas