elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con cliente FTP en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con cliente FTP en C  (Leído 2,184 veces)
DrKillador

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Problema con cliente FTP en C
« en: 27 Agosto 2013, 13:51 pm »

Hola amigos, estoy picandome un cliente ftp en C desde 0, para subir archivos a un FTP server. Llevo el siguiente código de momento, he conseguido autenticarme en el servidor ftp, pero al enviar el fichero archivo.txt, me lo crea vacío en el servidor, y no lo sube y me sale en el servidor como archivo vacio de 0bytes.

Alguien sabria decirme en que estoy fallando?

Código
  1. #pragma comment(lib, "wsock32.lib")
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <Winsock.h>
  5.  
  6. WSADATA ws;
  7. char buf[10000];
  8. void output(char *str)
  9. {
  10.      FILE *fp = fopen("output.txt", "a+");
  11.      fprintf(fp, "%s\n", str);
  12.      fclose(fp);
  13. }
  14.  
  15. SOCKET ConnectFTP(char* ftpname, int port)
  16. {
  17.      WSAStartup(0x101, &ws);
  18.      // Open up a socket for out TCP/IP session
  19.      SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
  20.      // Set up socket information.
  21.      struct sockaddr_in a = {AF_INET, htons(port)};
  22.      // Get the ip address of our ftp
  23.      struct hostent *h = gethostbyname(ftpname);
  24.      a.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)h->h_addr)));
  25.      // Actually connect to the server
  26.      connect(s, (struct sockaddr *)&a, sizeof(a));
  27.      return s;
  28. }
  29.  
  30. void receiving(SOCKET s, char* string)
  31. {
  32.      char aa[1000] = {'/0'};
  33.      int ii = recv(s, aa, sizeof(aa), 0);
  34.      sprintf(buf, "~%s~", aa);
  35.      output(buf);
  36.      if(string !=0)
  37.            strcpy(string, aa);
  38. }
  39.  
  40. void sending(SOCKET s, char* verb)
  41. {
  42.      strcpy(buf, verb);
  43.      strcat(buf, "\r\n");
  44.      output("Sending: ");
  45.      output(buf);
  46.      send(s, buf, strlen(buf), 0);
  47. }
  48.  
  49. int _stdcall WinMain(HINSTANCE i, HINSTANCE j, char* k, int l)
  50. {
  51.      printf("Arrancando...\n");
  52.      SOCKET s1 = ConnectFTP("ftp.XXXXXXXXXXXXX.com", 21);
  53.      receiving(s1,0);
  54.      printf("Enviando usuario...\n");
  55.      sending(s1, "USER XXXXXX");
  56.      receiving(s1,0);
  57.      printf("Enviando contrasena...\n");
  58.      sending(s1, "PASS XXXYYYZZZ");
  59.      receiving(s1,0);
  60.      sending(s1, "CWD web");
  61.      sending(s1, "PASV");
  62.      char szString[1000];
  63.      receiving(s1, szString);
  64.      printf("Sending ...\n");
  65.      sending(s1, "STOR archivo.txt");
  66.      sending(s1, "QUIT");
  67.      receiving(s1,0);
  68.      return 0;
  69. }
  70.  

El programa no me devuelve ningún error, a priori parece que funciona bien, aunque no sube el archivo, solo crea uno con el mismo nombre varcío

Gracias de antemano


« Última modificación: 28 Agosto 2013, 18:01 pm por DrKillador » En línea

Python <3 Python
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema con cliente FTP en C
« Respuesta #1 en: 28 Agosto 2013, 20:46 pm »

Ante el envió de cualquier comando, el servidor FTP siempre responde con ACK o NACK. Deberías modificar el código para que sea sensible a los errores enviados por el servidor.

En cuanto a tu error... Estas enviando el mensaje "STOR archivo.txt"... Con eso estas diciéndole al servidor que le vas a enviar un archivo con nombre archivo.txt... Pero no le estas enviando el contenido.

Después de enviar ese comando tienes que abrir el archivo y enviarlo al servidor conforme a lo que dicte el estandard de FTP. Tu piensa que el servidor no tiene acceso al sistema de archivos del cliente... Por lo que no puede coger archivos así por las buenas.


En línea

DrKillador

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Re: Problema con cliente FTP en C
« Respuesta #2 en: 29 Agosto 2013, 21:46 pm »

Entiendo, muchas gracias.

Me he estado leyendo la RFC de FTP (http://www.rfc-es.org/rfc/rfc0959-es.txt) y sino he entendido mal, que sigo un poco liado he visto que para enviar el fichero, en mi caso TYPE A porque es de texto, habria que abrir simplemente un socket y enviar el contenido del archivo leido en modo texto. Por lo que he añadido el siguiente codigo despues del STOR:

Código
  1. char *ficheroA;
  2. FILE *pFichero;
  3.      char caracter;
  4.      pFichero=fopen("a.txt", "rb");
  5.      while (!feof(pFichero))
  6.      {
  7.          caracter = fgetc(pFichero);
  8.          sprintf(ficheroA,"%s%c",ficheroA,caracter);
  9.      }
  10.      fclose(pFichero);
  11.  
  12.      sending(s1, ficheroA);

Y luego he leído que directamente con enviarle un QUIT ya da por cerrado el fichero. Pero sigue sin funcionarme y no me envia el archivo, solo me lo crea vacío.

¿Se me escapa algo?

Saludoss
En línea

Python <3 Python
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema con cliente FTP en C
« Respuesta #3 en: 29 Agosto 2013, 22:23 pm »

FicheroA es un puntero a tipo char no inicializado. Si no quieres complicar te la vida, crea un buffer lo suficientemente grande como para almacenar los archivos de prueba. Si quieres hacerlo bien, calcula el tamaño del archivo y crea un buffer adecuado a su tamaño... luego no te olvides de liberar la memoria reservada.

Además la forma de leer el archivo es lo opuesto a optimización del rendimiento. Por cada carácter que lees del archivo realizas una copia de lo leído anteriormente y luego le añades el caracter leído. Además el buffer no esta inicializado luego lo que resulte de tu código es totalmente aleatorio.

Lo suyo es que leas el archivo del tirón o, si quieres hacerlo carácter a carácter, usa un int para almacenar el la posición en la que va el char y te olvidas de ese código diabólico que tienes.

Para asegurar que la lectura es correcta, saca el buffer por pantalla antes de enviar los datos al servidor.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con sockets Cliente - Servidor ( IP )
Programación Visual Basic
EstoyBaneado 8 3,422 Último mensaje 22 Agosto 2005, 02:06 am
por soplo
Problema cliente / servidor ; procesos del sistema
Programación Visual Basic
dark_soul 1 1,622 Último mensaje 11 Mayo 2006, 04:48 am
por <--v1c1ous-->
Problema con cliente de un Servicio Web
Java
Schattenmann 0 1,612 Último mensaje 18 Noviembre 2012, 01:35 am
por Schattenmann
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines