Ver Mensaje Individual
  #4 (permalink)  
Antiguo 28/08/2013, 16:03
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Problema con cliente FTP en C

Vaya al final me pico la curiosidad :)

Al entrar en modo pasivo recibes una lista de numeros, que son una redireccion a una ip y un nº de puerto. La redireccion puede apuntar al mismo servidor o a otro, eso es lo de menos porque siempre tienes que parsear ese dato y usar el que te diga el servidor. Esto es lo que recibo en un test:

Código C:
Ver original
  1. Entering Passive Mode (127,0,0,1,207,22)

Parseo por comas los 4 primeros campos que son la redireccion (en este caso me dice que conecte a mi propio equipo por el loopback). Ahora me quedan los 2 campos finales que tambien los parseo y los convierto a enteros, de forma que tengo hp=207 y lp=22, con esto reconstruyo en numero de puerto pasivo en el que me estará esperando el servidor

Código C:
Ver original
  1. int puerto = (hp*256) + lp;

Te preguntaras: ¿eso para que? En el rfc tienes la descripcion de todo eso mas completa que lo que yo te pueda contar http://www.faqs.org/rfcs/rfc959.html Si no quieres leerlo tiene algo que ver en que todos los valores de ese resultado son representaciones textuales de enteros de 8 bits; el puerto está en 16 bits, luego haces esa operacion para crear un 16 bits a partir de los dos recibidos. Ojo, ese puerto que generas no esta en network byte order, es decir que cuando vas a crear el socket de trabajo tendras que usar el htons igualmente. Cuando se comenta esto suele decirse: me lo creo y paso a lo siguiente :)

Ahora solo te queda hacer una nueva conexion a la ip que recibes con ese puerto y empezar a subir.

Saludos
vosk