Ayuda envío archivo a web con C vía http

Iniciado por Kaxperday, 20 Julio 2014, 12:23 PM

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

Kaxperday

Y para subirlo lo guardo todo el archivo en una cadena y hago el POST si es que es viable, o como es eso de abrir el archivo en stream?, soy muy pesado lo se xD.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

abrirlo con fstream en caso de C++, o un FILE en C. O bueno, como quieras abrir el archivo xD El caso es que lo que leas, lo enviés por el socket.

Kaxperday

Supongo que esto debería funcionar:

archivo=fopen("archivito.txt","rt");
        while (fgets(cod, 100, archivo) != NULL)
        {
            strcpy(ced,"");
            strcat(ced,"nombre=archivo&contenido=");
            strcat(ced,cod);
            len=strlen(ced);
            itoa(len,cad,10);
            strcpy(buffer,"POST /script.php HTTP/1.0\r\n");
            strcat(buffer,"Host: mipagina.com\r\n");
            strcat(buffer,"Content-type: application/x-www-form-urlencoded\r\n");
            strcat(buffer,"Content-length: ");
            strcat(buffer,cad);
            strcat(buffer,"\r\n\r\n");
            strcat(buffer,ced);
            printf("%s\n",buffer);
       
            if(connect(sock,(struct sockaddr*)&direccion,sizeof(direccion))==-1)
            {
                printf("\nError al conectar.\n");
                exit(0);
            }
            printf("\nConectado correctamente.\n");

            if((send(sock,buffer,strlen(buffer),0))==-1)
            {
                printf("Error Send.\n");
                exit(0);
            }
        }


Que vaya enviando POST con el contenido del archivo hasta que se acabe, aunque no se como funciona pues no me va a mi el programa, lo que le falta es control de errores, puede que falle un POST en algún momento, y no se tiene en cuenta, por lo demás bien.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

#63
Solo tienes que mandar 1 post. Primero la cabecera entera, y luego lees el archivo

Kaxperday

XD te refieres en guardar el archivo entero en una cadena y enviarla como variable al servidor? Si el archivo es grande funcionará?, si es así perfecto  ;-)
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

Yo lo primero que hago, es leer el tamaño del archivo. Entonces, enviar la cabecera con el content-length calibrado.
Y luego, lees el archivo, y lo que lees lo envías. No hace falta guardarlo.

daryo

mejor codificalo en base64 asi no tendras caracteres raros y en el servidor con php lo decodificas
buenas

ivancea96

No hace falta codificar. Dado que es un archivo, los datos y los "caracteres raros" pasan sin problema.

Kaxperday

Curioso, entonces como propones enviar el archivo a la vez que lo lees sin guardar lo que lees en variables. Es decir yo solo se subir variables con POST, para subir un archivo tendría que subir o una variable cargadísima con todo su contenido, o bien varias con poco contenido, pero haciendo varios POST, es eso correcto? Si a lo que te referias no es a ninguna de las 2 anteriores me gustaría conocer tu idea.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

Casualmente acabo de termianr un servidor HTTP en C++. Y eso es justo lo que hago jaja

Para evitar tener una variable de 5 megas, o de 1 giga incluso, hago esto:

Código (cpp) [Seleccionar]

char arr[1024];
ifstream f("...",ios::binary);
while(!f.eof()){
    f.read(arr,1024);
    if(f.eof())
        serv.send(0,string(arr,f.gcount()));
    else
        serv.send(0,string(arr,1024));
}


Está en C++.
serv.send() es para enviarle a un cliente de mi servidor la string.
f.gcount() devuelve la cantidad de bytes leídos (en caso de no haber leído el tamaño del array (1024) )

Donde yo pongo serv.send(), tú pondrías send(socket,... ...).

Es eso, no más. Un dato importante: Si envías muchos datos rápidamente, send() puede devolver error WSAWOULDBLOCK. Por lo tanto, te aconsejo que coloques el socket como blocking antes de enviar.

Para ello, un snippet:
Código (cpp) [Seleccionar]
void setBlocking(SOCKET sock, bool blocking){
    u_long block = blocking ? 0 : 1;
    ioctlsocket(sock, FIONBIO, &block);
}


Ese es un método de "partir" e ir enviando el archivo mientras lo lees.

Bueno, creo que eso es todo.