Subir un archivo a un FTP

Iniciado por gxg, 13 Febrero 2011, 21:49 PM

0 Miembros y 1 Visitante están viendo este tema.

gxg

Hola. estoy utilizando este codigo para que mi programa suba un txt a  ftp, se conecta bien, pero la funcion FtpPutFile me devuelve false. No se que esta fallando en esta funcion, tengo un archivo llamado texto.txt en la misma carpeta que el programa.
¿Me podeis dar alguna idea de lo que pueda estar fallando?



Citar#include <stdio.h>
#include <wininet.h>

int main(int argc, char *argv[]) {
    HINTERNET Open=InternetOpen("Explorador",0,NULL,NULL,0);
    if(Open==NULL){
       printf("
  • Error al abrir la conexion\n");
           return -1;
           }
        printf("
  • Abriendo conexion..");
       
        HINTERNET Connect=InternetConnect(Open,direccion,21,
                         usuario,contraseña,INTERNET_SERVICE_FTP,0,0);
        if(Connect==NULL){
           InternetCloseHandle(Open);
           printf("
  • Error al conectar con el servidor\n");
           getchar();
           return -1;
           }
           
        printf("OK\n");
        printf("
  • Subiendo archivo...");
       
        BOOL File = FtpPutFile(Connect,"texto.txt","texto.txt",FTP_TRANSFER_TYPE_BINARY,0);
        if (File==FALSE) {
            InternetCloseHandle(Open);
            InternetCloseHandle(Connect);           
            printf("
  • Error al subir archivo\n");
            getchar();
            return -1;
            }
           
        printf("OK\n");
       
        InternetCloseHandle(Open);
        InternetCloseHandle(Connect);
        getchar();
        return 0;
    }

The Swash

Amigo, primeramente 2 detalles te recomendaría que llames a la función especificando el tipo de códificación de caracteres ANSI o UNICODE respectivamente A y W.
Ejemplo:

InternetOpenA
InternetConnectA
FtpPutFileA
FtpSetCurrentDirectoryA


Ahora tu problema además puede deberse a que no estableces el directorio donde escribir el archivo para ello te recomiendo FtpSetCurrentDirectoryA
Prueba y nos comentas..
Saludos



burbu_1

hola  :D,

he probado tu code y me ha ido bien... ;-)

además de lo que comenta The Swash, 
prueba a poner INTERNET_FLAG_PASSIVE en InternetConnect,
tal vez sea por el server  :-\

Eternal Idol

Si uno configura bien el proyecto no hace falta llamar explicitamente a las funciones A o W, las funciones sin estos caracteres son macros que se definen a la correcto automaticamente.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

gxg

#4
Bien, ya he conseguido que funcione, pero ahora tengo un pequeño problema.
La primera vez que se ejecuta este programa en un equipo salta una alarma del firewall de windows que hay que darle manualmente a desbloquear.

¿Se puede evitar esto de alguna manera?

Karman

Cita de: gxg en 16 Febrero 2011, 22:43 PM
Bien, ya he conseguido que funcione, pero ahora tengo un pequeño problema.
La primera vez que se ejecuta este programa en un equipo salta una alarma del firewall de windows que hay que darle manualmente a desbloquear.

poné el código en una dll e inyectala a otro proceso... je

S2

Garfield07

La verdad es que tu código no es una delicia :P...

Este code de aquí ni está terminado ni probado. Tengo mis reservas para usar fscanf, pero bueno... El code tiene muchísimos errores, lo tienes que retocar un puñado, pero creo que se entiende que es mejor no usar las funciones que tú usas...
Mejoras a mi code...
1) User & Pass
2) Mejora mandar archivos.
3) Corrección de fallos de seguridad.
Etc...

Lo siento, pero estoy cansado :P. Aquí te lo dejo, con tres puntitos a mejorar...

#include <time.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <winsock2.h>



struct sockaddr_in host;

char buffer;

SOCKET sockfd;

int cont = 0;
FILE *fp;



int times ()

{

time_t now=time (0);

struct tm *ahora;

char buffer [40];

ahora= (struct tm*)localtime ((const time_t*)&now);

strftime (buffer, 40, "%d/%m/%Y %H:%M:%S" , ahora);

printf ("%s   ", buffer);

return 0;

}



int main (int argc, char *argv [])

{

WSADATA wsa;

WSAStartup(MAKEWORD(2,2),&wsa);

time_t now=time (0);

struct tm *ahora;

char hora [40];

ahora=localtime ((const time_t*)&now);

strftime (hora, 40, "%d/%m/%Y %H:%M:%S" , ahora);

printf ("FPPT 1.0 - By Sagrini (2010) - %s\n", hora);



if (argc != 4)
{

printf ("%s <target_ip> <port> <txt>\n\n", argv [0]);
return 1;
}
if ((sockfd=socket (2, 1, 0))==-1)
{
printf ("Fatal error creating socket...\n\n");
return 1;
}

host.sin_port=htons(port);

host.sin_family=AF_INET;

host.sin_addr.s_addr=inet_addr (IP);

memset (host.sin_zero, 0, 8);



if((connect (sockfd, (struct sockaddr*)&host, sizeof (host)))==-1)
{
printf ("Fatal error connecting socket...\n\n");
return 1;
}

times ();

printf ("Got connection with %s:%d\n", inet_ntoa (host.sin_addr), ntohs (host.sin_port));



if ((fp = fopen (argv [3], "r+"))==-1)
{
printf ("Fatal error opening %s...\n\n", argv [3]);
return 1;
}
while (!feof (fp))
{
fscanf (fp, "%c", &buffer);
send (sockfd, buffer, 1, 0);
}


closesocket (sockfd);

printf ("Finishing connection with %s:%d\n\n", inet_ntoa (host.sin_addr), ntohs (host.sin_port));

return 0;

}


Sobre la última pregunta... Pues mira, coge y desactiva el firewall xD


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

gxg

Necesito un codigo que anule el firewall de windows sin que el usuario se de cuenta.

O que añada a mi programa en las excepciones del firewall.


Citarmejor no usar las funciones que tú usas...

¿Por que?

burbu_1

el firewall de windows solo bloquea las conexiones entrantes y no las salientes....
por qué no usas el MODO PASIVO como te recomendé antes???


HINTERNET Connect=InternetConnect(Open,direccion, 21, usuario,contraseña, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);