Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 20 Julio 2014, 12:23 pm



Título: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 20 Julio 2014, 12:23 pm
Quiero enviar un archivo mediante HTTP a una web, que recoje las variables desde la url con un script en php, el cliente debe enviar un archivo cifrado e ir cargándolo en las variables poco a poco, hay que usar sockets en C para windows pero no encuentro  los apuntes adecuados, e buscado y no encuentro nada, ¿se os ocurre algo?

Ayuda por favor es un proyecto importante, confio en vosotros.


Título: Re:
Publicado por: ivancea96 en 20 Julio 2014, 12:27 pm
1: abrir socket TCP conectándolo con el servidor.
2: enviar la petición http POST, con el archivo.

¿Cuál no consigues hacer


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 20 Julio 2014, 13:18 pm
Como hago los sockets para enviar el HTTP POST en C, yo se abrir sockets con windows, conecto al servidor web puerto 80, y entonces como hago para subir el archivo, necesito apuntes o código, la idea es subir archivo mediante POST interactuando con server web que recoje variables desde la URL con php, pero no se como lanzar esas variables al servidor en plan :

miweb.com/index.php?var=pass&wew=232323

Por ejemplo, como hago un codigo en C suponiendo sockets abiertos y conectado correctamente para enviar esto a una web

edito: pasame los apuntes para aprender a como hacerlo si no te importa o alguna ayuda no me vendria mal, quiero hacerlo, gracias


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 20 Julio 2014, 13:43 pm
El POST es así:
Código:
POST url HTTP/1.1\r\n
...\r\n
...\r\n
content-length:XXXX\r\n
...\r\n
\r\n    //este salto de línea marca el final de la cabecera
var=datos&var2=datos2

XXXX vendría siendo el tamaño del cuerpo, que es todo lo que hay después del último salto de línea de la cabecera.
\r\n es el salto de línea completo.

Subir un archivo, es poner var=datos_del_archivo. Recuerda abrir el archivo en binario.

Creo que no se me olvida nada xD Prueba primero a hacerlo con una simple cadena, y luego ya lo haces con archivos

No se que tal entendiste. Tú dirás :o


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: xustyx en 20 Julio 2014, 13:47 pm
Seguramente digo una locura por que no tengo ni idea de C pero supongo que debe existir alguna librería para facilitar eso por ejemplo Curl.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 20 Julio 2014, 13:55 pm
Haberlas las hay. Pero hacer peticiones es sencillo. Ni hace falta usar una librería xD


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: xustyx en 20 Julio 2014, 15:10 pm
Lo sé pero tiene pinta de no saber crearlas.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: naderST en 20 Julio 2014, 20:36 pm
Yo utilizaría cURL, aquí tienes un ejemplo:

http://curl.haxx.se/libcurl/c/fileupload.html (http://curl.haxx.se/libcurl/c/fileupload.html)


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 21 Julio 2014, 16:12 pm
El POST es así:
Código:
POST url HTTP/1.1\r\n
...\r\n
...\r\n
content-length:XXXX\r\n
...\r\n
\r\n    //este salto de línea marca el final de la cabecera
var=datos&var2=datos2

ok, que funcion debería de usar para mandar esta cadena?


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 21 Julio 2014, 17:15 pm
Lo envías por un socket que tengas abierto al servidor.
Tras enviarlo, ponte a recibir hasta que recibas toda la respuesta del servidor.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 21 Julio 2014, 17:43 pm
Código:
int main()
{
    WSADATA wsa;
    struct sockaddr_in direccion;
    int sock, puerto=80;
    char buffer[200];
    ssize_t n;

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

    if((sock=socket(AF_INET,SOCK_STREAM,0))==-1 )
    {
        printf("Problema al crear el socket");
        getch();
        exit(0);
    }
    else
    {
        direccion.sin_family=AF_INET;
        direccion.sin_port=htons(puerto);
        direccion.sin_addr.s_addr=inet_addr(ip);


        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
        strcat(buffer,"Host: dominioweb.com\r\n");
        strcat(buffer,"Context-type: application/x-www-form-urlencoded\r\n");
        strcat(buffer,"Content-length: 34\r\n\r\n");
        strcat(buffer,"nombre=yupiiii \r\n");
        printf("%s",buffer);

        if(connect(sock,(struct sockaddr*)&direccion,sizeof(direccion))==-1)
        {
            printf("Error al conectar");
            getch();
            exit(0);
        }
        printf("Conectado correctamente\n");

        if((write(sock,buffer,strlen(buffer)))==-1)
        {
            printf("Error write");
            getch();
            exit(0);
        }
        printf("write realizado.\n");
    }
    return 0;
}

Se crea el socket correctamente con la ip del servidor web y con su puerto 80, ahora bien el write da error no consigo enviar datos que me falla? gracias a todos por su ayuda, haber si lo consigo acabar ;)


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 21 Julio 2014, 20:24 pm
No es "write". Es "Send".

Código
  1. write(sock,buffer,strlen(buffer),0)

Y cuidado con el content-length. El content-length debe ser el tamaño exacto del cuerpo. En caso de "nombre=yupiiii", sería 14. Despues del body, no hace falta ningún \r\n. Una vez que el servidor lea todo el X caracteres del body (X == content-length), el resto lo va a ignorar. O más que ignorar, se lo puede tomar como otra petición.

Y eso si, si el content-length es más grande que el contenido real, posiblemente el server se quede en espera y no te conteste.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 22 Julio 2014, 00:22 am
Gracias por tu ayuda compañero me esta siendo útil como aprendizaje, aunque sigue sin ir, te dare más detalles al respecto, es lo mínimo que puedo hacer.

Este es el código php que corre en el index.php del servidor web:

Código:
<?php
$nombre=htmlspecialchars($_GET["nombre"]);
$contenido=htmlspecialchars($_GET["contenido"]);
$fp=fopen("./archivos/" . $nombre . ".txt","at");
fwrite($fp,$contenido);
fclose($fp);
?>

Entonces yo voy a mi página, pongo en la url las variables dentro de index.php y me crea un archivo con un nombre y un contenido, es simple, desde el navegador funciona sin problemas.

htmlspecialchars recoge los valores de las variables en la url (nombre y contenido) y las asigna a otras variables nombre y contenido.

El código actualizado del cliente que sube los datos es el siguiente:

Código:
int main()
{
    WSADATA wsa;
    struct sockaddr_in direccion;
    int sock, puerto=80;
    char buffer[200];
    ssize_t n;

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

    if((sock=socket(AF_INET,SOCK_STREAM,0))==-1 )
    {
        printf("Problema al crear el socket");
        getch();
        exit(0);
    }
    else
    {
        direccion.sin_family=AF_INET;
        direccion.sin_port=htons(puerto);
        direccion.sin_addr.s_addr=inet_addr(ip);


        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
        strcat(buffer,"Host: dominioweb.com\r\n");
        strcat(buffer,"Context-type: application/x-www-form-urlencoded\r\n");
        strcat(buffer,"Content-length: 25\r\n\r\n");
        strcat(buffer,"nombre=nombre123correcto");
        printf("%s",buffer);

        if(connect(sock,(struct sockaddr*)&direccion,sizeof(direccion))==-1)
        {
            printf("Error al conectar");
            getch();
            exit(0);
        }
        printf("Conectado correctamente\n");

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

Lo he compilado no da errores, la IP del servidor web es correcta, el programa no da ningun error y finaliza satisfactoriamente, sin embargo actualizo la web y no aparece ningún archivo ni ningún tipo de datos, algo ha fallado pues y con lo poco que se no tengo ni idea xP.

Eso es todo compa espero que me podáis ayudar, gracias


Título: Re:
Publicado por: ivancea96 en 22 Julio 2014, 10:40 am
Estás poniendo en el php $_GET[], cuando debería ser $_POST[]


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 22 Julio 2014, 15:22 pm
Gracias eso he puesto lo demás esta todo igual el programa se ejecuta bien pero sigue sin enviar datos :"""(((( xD


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: eferion en 22 Julio 2014, 16:21 pm
no estás enviando nada bajo la variable "contenido"... ¿no será que te está creando el archivo pero lo deja vacío?


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 22 Julio 2014, 19:13 pm
Nose trata de eso, no crea ningún archivo, el script funciona con solo poner el nombre (eso hace que cree un archivo con ese nombre y le añade terminacion txt), pero no se crea el archivo a pesar de que envio el nombre, si pongo solo nombre y no contenido da lo mismo ya lo probé xP, no se qué será si tuvieseis algunos apuntes sobre esto, me vendrían muy bien.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: eferion en 22 Julio 2014, 21:15 pm
Estás seguro de que tienes permisos de escritura para la ruta del archivo?


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 22 Julio 2014, 23:40 pm
No debería de haber problemano he puesto ninguna restricción en ningún directorio, cuando probaba con el GET y metida las variables en la URL desde el navegador las recogia correctamente y se creaba el archivo con su contenido, ahora he cambiado el GET por el POST como dijisteis y el código ahí esta, solo he cambiado la esto:

Código:
strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
        strcat(buffer,"Host: dominio.com\r\n");
        strcat(buffer,"Context-type: application/x-www-form-urlencoded\r\n");
        strcat(buffer,"Content-length: 42\r\n\r\n");
        strcat(buffer,"nombre=nombre123correcto&contenido=123456");
        printf("%s",buffer);

Pero sigue sin funcionar, ideas?


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: eferion en 23 Julio 2014, 08:34 am
Una pregunta tonta... en qué punto concreto has inicializado el socket. Algo del tipo:

Código
  1. if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){ }

Si no has inicializado el socket es como intentar escribir en un fichero que no has abierto.

Esta línea o su equivalente debería ir antes del "connect".


Cierto, error mio, no lo ví y eso que estuve mirando el código con "tranquilidad".

Un saludo.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 23 Julio 2014, 10:29 am
Lo inicializo en la sentencia if, una vez ejecuta el else ya debería haber creado el socket.

Código:
int main()
{
    WSADATA wsa;
    struct sockaddr_in direccion;
    int sock, puerto=80;
    char buffer[200];
    ssize_t n;

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

    if((sock=socket(AF_INET,SOCK_STREAM,0))==-1 )
    {
        printf("Problema al crear el socket");
        getch();
        exit(0);
    }
    else
    {
        direccion.sin_family=AF_INET;
        direccion.sin_port=htons(puerto);
        direccion.sin_addr.s_addr=inet_addr(ip);


        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
        strcat(buffer,"Host: dominio.com\r\n");
        strcat(buffer,"Context-type: application/x-www-form-urlencoded\r\n");
        strcat(buffer,"Content-length: 42\r\n\r\n");
        strcat(buffer,"nombre=nombre123correcto&contenido=123456");
        printf("%s",buffer);

        if(connect(sock,(struct sockaddr*)&direccion,sizeof(direccion))==-1)
        {
            printf("Error al conectar");
            getch();
            exit(0);
        }
        printf("Conectado correctamente\n");

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

Este era el php, lo tengo dentro del directorio public_html del servidor web, en el mismo directorio tengo la carpeta archivos donde almacena los archivos que le mando.

Código:
<?php
$nombre=htmlspecialchars($_POST["nombre"]);
$contenido=htmlspecialchars($_POST["contenido"]);
$fp=fopen("./archivos/" . $nombre . ".txt","at");
fwrite($fp,$contenido);
fclose($fp);
?>

Decir que no es un script como tal, ya que index.php tiene muchas más funciones como tiene divs, menus, etc, quizas si separara el script de php y lo llamase en vez de hacerlo a todo el index funcionaria o igual es indiferente, lo probaré de momento esto es lo que tengo.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: eferion en 23 Julio 2014, 10:40 am
Cómo estás generando "ip"?


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 23 Julio 2014, 12:20 pm
Hago un ping a mi dominio web de ahí obtengo la IP que la defino como variable global en el cliente en C.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: eferion en 23 Julio 2014, 13:18 pm
y asumo que has comprobado que el valor almacenado en esa variable es el correcto, cierto?


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 23 Julio 2014, 14:54 pm
Gracias por tu ayuda eferion, ahora deja a los demás responder, el código ya está posteado no voy a responder preguntas absurdas.

Edito: ¿No ves que si? OMG antes de preguntar dedica un minisegundo a mirar el código


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: eferion en 23 Julio 2014, 15:14 pm
Edito: ¿No ves que si? OMG antes de preguntar dedica un minisegundo a mirar el código

Código
  1. direccion.sin_addr.s_addr=inet_addr(ip);

Si, pedazo de comprobación... seguro que esta línea funciona aunque en "ip" esté poniendo "estoesunamierda" en vez de algo tipo "192.168.1.5"... si, no se cómo no he podido ver que, efectivamente, estabas haciendo todas las comprobaciones precisas para asegurar que "ip" tiene una dirección IP válida.

Gracias por tu ayuda eferion, ahora deja a los demás responder, el código ya está posteado no voy a responder preguntas absurdas.

Me parece estupendo... seguro que con tus super conocimientos de C y C++ eres capaz de sacarlo tu solo... a no, espera, que estás aquí pidiendo ayuda.

¿Crees que le estoy quitando a alguien el derecho a responderte? ¿De verdad sabes cómo funciona Internet?

Si alguien te quiere responder lo podrá hacer te pregunte o no absurdeces que, dicho sean de paso, pueden dar lugar a que tu super programa de 30 líneas no funcione.

Ahora permite que un ignorante como yo que, de seguro, ha hecho más programas que tú (y que además funcionan) te explique un pequeño detalle:

Citar
Si tu programa tuviese un error de bulto habría aflorado en los primeros 3 o 4 mensajes, la gente que suele contestar en este foro no es manca... Dado que no ha sido así tu problema puede estar en los detalles más absurdos:

* Falta de permisos de escritura
* Estás recuperando mal la IP
* No has inicializado correctamente el socket (ya se ha visto que no es esto)

Detalles así de divertidos y de obvios que hacen que la gente pierda su tiempo en contestar a una persona como tú que recurre aquí porque no tiene ni la más remota idea de cómo solucionar un problema... y encima se queja cuando la intentan ayudar... no se, tu mismo.

Y dicho esto, te tomo la palabra. Tranquilo que no vuelvo a pasarme por este hilo... ni por este ni por ninguno que abras... puede que con esto pierdas algún que otro consejo valioso o puede que no. Yo por mi parte me guardo mi opinión personal al respecto.



EDITO:

Solo una pregunta tonta que vuelvo a repetir porque, insisto, no lo veo en el código

¿Dónde narices está el código que asigna un valor a "ip"?

O mejor, no contestes, seguro que así es más divertido encontrar el fallo a tu programa.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 23 Julio 2014, 15:52 pm
Hazle caso a eferion.
Nos parece muy bien que quieras ocultar a ip de tu servidor, pero al menos pon la ip de Google para probar.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 23 Julio 2014, 16:28 pm
jajaja ya lo siento eferion pensaba que me estabas vacilando no quería ser cruel, pero tus preguntas me parecian absurdas y que estaban en el código todas, sino fallo mio por pasarme de listo xD.

La IP es así 84.234.145.130 solo que con numeros cambiados, la obtuve haciendo ping al servidor web, y el socket se crea correctamente,no creo que haya ningún fallo al respecto xD ya lo siento jaja pense que estabas vacilando o algo por el estilo.

Edito la ip se define como variable global: #define ip "84.234.145.130" exactamente.

Ahora estoy probando los valores que devuelven y parece que si hay un problema :

Código:
direccion.sin_family=AF_INET;
        direccion.sin_port=htons(puerto);
        direccion.sin_addr.s_addr=inet_addr(ip);

printf("%d\n",direccion.sin_family);//muestra 2
printf("%d\n",direccion.sin_port);//muestra 20480
printf("%d\n",direccion.sin_addr.s_addr);//muestra -21023899

Pero no entiendo la IP es la que devuelve el ping no? xD

Edito otra vez este es todo el code:

Código:
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <string.h>
#define ip "81.120.113.100"

int main()
{
    WSADATA wsa;
    struct sockaddr_in direccion;
    int sock, puerto=80;
    char buffer[200];
    ssize_t n;

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

    if((sock=socket(AF_INET,SOCK_STREAM,0))==-1 )
    {
        printf("Problema al crear el socket");
        getch();
        exit(0);
    }
    else
    {
        direccion.sin_family=AF_INET;
        direccion.sin_port=htons(puerto);
        direccion.sin_addr.s_addr=inet_addr(ip);

        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
        strcat(buffer,"Host: dominio.com\r\n");
        strcat(buffer,"Context-type: application/x-www-form-urlencoded\r\n");
        strcat(buffer,"Content-length: 42\r\n\r\n");
        strcat(buffer,"nombre=nombre123correcto&contenido=123456");
        printf("%s",buffer);

        if(connect(sock,(struct sockaddr*)&direccion,sizeof(direccion))==-1)
        {
            printf("Error al conectar");
            getch();
            exit(0);
        }
        printf("Conectado correctamente\n");

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

De todas formas no se porque falla eso y el connect no falla luego, no tengo apuntes de sockets para win y no se como va esto voy mirando por internet ojeando y probando.

Edito otra vez, me acabo de dar cuenta de que tenia la IP que correspondia a algo en plan cochesymotos.com, peeero acabo de caer en que seguramente sea la misma que pongo cuando me conecto con filezilla al servidor que es en plan server83.host44.com, hice ping a esa direccion y me devolvio una ip parecida pero distinta, cambie la ip en el cliente y el resultado fue el mismo.

printf("%d\n",direccion.sin_family);//muestra 2
printf("%d\n",direccion.sin_port);//muestra 20480
printf("%d\n",direccion.sin_addr.s_addr);//muestra 1503701535


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: eferion en 23 Julio 2014, 17:03 pm
jajaja ya lo siento eferion pensaba que me estabas vacilando no quería ser cruel, pero tus preguntas me parecian absurdas y que estaban en el código todas, sino fallo mio por pasarme de listo xD.

En ese caso sin problemas. Intento que mis preguntas tengan cierto sentido, aunque a veces no lo parezcan. Me puede pasar, como a todo hijo de vecino, que pregunte algo que ya esté contestado en el código... pese a quien le pese soy humano y a veces también me equivoco, aunque no lo hago de mala fe.

La IP es así 84.234.145.130 solo que con numeros cambiados, la obtuve haciendo ping al servidor web, y el socket se crea correctamente,no creo que haya ningún fallo al respecto

Ok, por tu comentario anterior pensé que estabas leyendo la IP dinámicamente haciendo un ping al servidor o algo así... y no me cuadraba el asunto para nada. Cuando consigas corregir esto sería una buena mejora que permitas especificar la dirección del servidor en un archivo de configuración (bien por DNS - lo ideal -, bien por ip). Tener estos datos escritos a pelo en el código solo dan problemas.

printf("%d\n",direccion.sin_family);//muestra 2
printf("%d\n",direccion.sin_port);//muestra 20480
printf("%d\n",direccion.sin_addr.s_addr);//muestra -21023899

Pero no entiendo la IP es la que devuelve el ping no? xD

la función inet_addr hace una conversión para "empaquetar" la ip en formato de red. Esta función tiene en cuenta, entre otras cosas, si tu máquina es BIG ENDIAN o LITTLE ENDIAN a la hora de realizar la conversión... además la IP es de tipo "unsigned", luego si la imprimes con "%d" que se usa para "signed", el valor que te saque no va a servirte de mucho.

PD.: prueba a cambiar Context-Type por Content-Type. Hasta donde llego, Context-Type no es un parámetro válido de cabecera. Lo mismo al tener una cabecera incorrecta el servidor rechaza la conexión... o no sabe como tratarla.

Si esto no soluciona el problema yo realizaría otra prueba para eliminar puntos de fallo:

* Crea un programa que "emule" al servidor web, de tal forma que, simplemente, te saque por pantalla todo lo que reciba por el socket. Después lanza tu cliente contra este programa y mira a ver si imprimes algo. Así al menos puedes verificar que el programa realiza una salida y además puedes comprobar si ésta es la esperada.


Título: Re:
Publicado por: ivancea96 en 23 Julio 2014, 23:46 pm
Una recomendación.
Mientras no te funciona, prueba a conectarte con Google. Pon solo lo necesario, es decir:

GET / HTTP/1.1
Host:google.es

Y nada más.
Si logras conectar, pasamos al siguiente nivel


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 24 Julio 2014, 01:00 am
Ojala supiera emular un servidor, jaja entonces no estaba aquí supongo xD, ok gracias eferion es cierto ahí sería content, yo creo que es un fallo de cabecera, donde pongo host, pongo el host con el que accedo a la pagina desde navegador, no con el que accedo por ftp con filezilla, no se cual de los 2 poner.

Ivancea96 no se a que te refieres exactamente, pero realmente la conexion siempre la realiza solo necesita una IP y puerto, lo demás ya es el send, la conexión va sin problemas, cuando llega la orden del send a través del socket, es cuando envio eso de GET /HTTP... o POST... el send siempre va, lo envíe o no la funcion no me da error, yo creo que es un fallo de cabecera pues no se como debe de ser, o igual es la versión http del server no sé.

Por cierto probé con google.es y si conectaba, pero lo del GET /HTTP/1.1 no se para qué era necesario.

edito:

Puede que la IP este mal, no se que ip poner si la de cochesymotos.blabla.com, o la de server83.hostinger.com que uso para acceder a mi cuenta con filezilla, supongo que la de cochesymotos.blabla.com que devuelve con el ping.

Sigo investigando xD


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 24 Julio 2014, 01:05 am
Cuando decía si lograbas conectar, me refería a si podías enviar y recibir.
Hice una prueba con mi cliente, y tal como te lo puse debería responderte Google un 303.

Recuerda pasar el dominio y subdominio en host.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 24 Julio 2014, 01:08 am
no se como hacer para recibir la respuesta del server, yo solo puse en el send lo que me dijiste conecto y mando el send, pero claro no puedo ver la respuesta, no tengo funcion en el programa para capturarla.

edito:
A que te refieres con pasar el dominio y subdominio en el  HOST, ahí solo tengo:
Código:
strcat(buffer,"Host: mipagina.free33.com\r\n");

Y la IP que uso es la que devuelve el ping a esa direccion.

edito con todo actualizado:

Código:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define ip "81.226.363.191"

int main()
{
    WSADATA wsa;
    struct sockaddr_in direccion;
    int sock, puerto=80,len;
    char buffer[200],cad[20];
    ssize_t n;

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

    if((sock=socket(AF_INET,SOCK_STREAM,0))==-1 )
    {
        printf("Problema al crear el socket");
        getch();
        exit(0);
    }
    else
    {
        direccion.sin_family=AF_INET;
        direccion.sin_port=htons(puerto);
        direccion.sin_addr.s_addr=inet_addr(ip);

        /*printf("%d\n",direccion.sin_family);
        printf("%d\n",direccion.sin_port);
        printf("%d\n",direccion.sin_addr.s_addr);*/

        len=strlen("nombre=nombre123correcto&contenido=123456");
        itoa(len,cad,10);
        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
        strcat(buffer,"Host: mipaginaweb.free33.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");
        strcat(buffer,"nombre=nombre123correcto&contenido=123456");
        printf("%s\n",buffer);

        if(connect(sock,(struct sockaddr*)&direccion,sizeof(direccion))==-1)
        {
            printf("Error al conectar.\n");
            getch();
            exit(0);
        }
        printf("Conectado correctamente.\n");

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


Ok he actualizado para no andar contando en el content-length he quitado un \r\n que creo que sobraba pues iba detrás de otro.

Y bueno en el lado del server lo de siempre:

Código:
<html>
<head>
...
</head>
<body>
...
<?php
$nombre=htmlspecialchars($_POST["nombre"]);
$contenido=htmlspecialchars($_POST["contenido"]);
$fp=fopen("./archivos/" . $nombre . ".txt","at");
fwrite($fp,$contenido);
fclose($fp);
?>  
...
</body>

Eso es todo, lo dejo por hoy, haber si lo conseguimos, gracias.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: eferion en 24 Julio 2014, 08:59 am
Es una chorrada, pero es bueno ir adquiriendo buenas prácticas... sobretodo porque como te de en el futuro por cambiar algo te va a volver a dar problemas. Esto:

Código
  1.        len=strlen("nombre=nombre123correcto&contenido=123456");
  2.        itoa(len,cad,10);
  3.        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
  4.        strcat(buffer,"Host: mipaginaweb.free33.com\r\n");
  5.        strcat(buffer,"Content-type: application/x-www-form-urlencoded\r\n");
  6.        strcat(buffer,"Content-length: ");
  7.        strcat(buffer,cad);
  8.        strcat(buffer,"\r\n");
  9.        strcat(buffer,"nombre=nombre123correcto&contenido=123456");
  10.        printf("%s\n",buffer);

Se debería parecer más a esto:

Código
  1.        char* contenido = "nombre=nombre123correcto&contenido=123456";
  2.        len = strlen( contenido );
  3.        itoa(len,cad,10);
  4.        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
  5.        strcat(buffer,"Host: mipaginaweb.free33.com\r\n");
  6.        strcat(buffer,"Content-type: application/x-www-form-urlencoded\r\n");
  7.        strcat(buffer,"Content-length: ");
  8.        strcat(buffer,cad);
  9.        strcat(buffer,"\r\n");
  10.        strcat(buffer, contenido);
  11.        printf("%s\n",buffer);

El motivo es obvio... tener un mensaje duplicado implica tener que actualizarlo en dos o más sitios so pena que el paquete pase a estar mal construido y te falle la comunicación.

Ojala supiera emular un servidor, jaja entonces no estaba aquí supongo xD, ok gracias eferion es cierto ahí sería content, yo creo que es un fallo de cabecera, donde pongo host, pongo el host con el que accedo a la pagina desde navegador, no con el que accedo por ftp con filezilla, no se cual de los 2 poner.

Espero no haber metido la pata con el código, lo he hecho "a mano alzada" y no está probado.

Código
  1. #define MAX_BUFFER 512
  2.  
  3. // OJO que los puertos inferiores a 1024 estan reservados, lo mismo tienes que cambiar el puerto
  4. #define PUERTO_SERVIDOR "80"
  5.  
  6. int main( void )
  7. {
  8.    WSADATA wsaData;
  9.  
  10.    // Inicializamos WinSock
  11.    int errorCode = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
  12.    if ( errorCode != 0 )
  13.   {
  14.        printf("Error en WSAStartup: %d\n", errorCode );
  15.        getch( );
  16.        return 1;
  17.    }
  18.  
  19.    struct addrinfo configInicial;
  20.    ZeroMemory( &configInicial, sizeof( configInicial) ); // IMPORTANTE limpiar la memoria
  21.    configInicial.ai_family   = AF_INET;
  22.    configInicial.ai_socktype = SOCK_STREAM;
  23.    configInicial.ai_protocol = IPPROTO_TCP;
  24.    configInicial.ai_flags    = AI_PASSIVE;
  25.  
  26.    // Resolver la dirección IP y el puerto del servidor
  27.    struct addrinfo *configServidor= NULL;
  28.    errorCode = getaddrinfo( NULL, PUERTO_SERVIDOR, &configInicial, &configServidor );
  29.    if ( errorCode != 0 )
  30.    {
  31.        printf("Error en getaddrinfo: %d\n", errorcode );
  32.        WSACleanup( ); // IMPORTANTE reiniciar WinSock
  33.        return 1;
  34.    }
  35.  
  36.    // Crear socket de escucha
  37.    SOCKET socketServidor= INVALID_SOCKET;
  38.    socketServidor= socket( configServidor->ai_family, configServidor->ai_socktype, configServidor->ai_protocol );
  39.    if ( socketServidor== INVALID_SOCKET )
  40.    {
  41.        // Fijate que podemos obtener el codigo de error al crear el socket
  42.        printf("Error al crear socket de escucha: %ld\n", WSAGetLastError( ) );
  43.  
  44.        // Hay que limpiar la memoria
  45.        freeaddrinfo( configServidor );
  46.  
  47.        // Y reiniciar WinSock
  48.        WSACleanup();
  49.        return 1;
  50.    }
  51.  
  52.    // Se enlaza el socket del servidor para que use la ip y el puerto solicitado
  53.    errorcode = bind( socketServidor, configServidor->ai_addr, (int)configServidor->ai_addrlen );
  54.    if ( errorCode == SOCKET_ERROR)
  55.    {
  56.        printf("Error en bind: %d\n", WSAGetLastError( ) );
  57.  
  58.        // Liberamos recursos
  59.        freeaddrinfo( configServidor );
  60.        closesocket( socketServidor );
  61.        WSACleanup( );
  62.        return 1;
  63.    }
  64.  
  65.    // Ya no necesitamos esta configuracion, el socket esta creado
  66.    freeaddrinfo( configServidor );
  67.  
  68.    // Dejamos al socket esperando conexiones
  69.    errorCode = listen( socketServidor , SOMAXCONN );
  70.    if (errorCode == SOCKET_ERROR)
  71.    {
  72.        printf( "Error listen: %d\n", WSAGetLastError( ) );
  73.        closesocket( socketServidor);
  74.        WSACleanup( );
  75.        return 1;
  76.    }
  77.  
  78.    // Procesamos las peticiones que nos llegan
  79.    do
  80.    {
  81.        SOCKET socketCliente= INVALID_SOCKET;
  82.        socketCliente= accept( socketServidor, NULL, NULL );
  83.        if ( socketCliente== INVALID_SOCKET)
  84.        {
  85.            printf( "Error en conexion entrante: %d\n", WSAGetLastError( ) );
  86.            closesocket( socketServidor );
  87.            WSACleanup( );
  88.            return 1;
  89.        }
  90.  
  91.        // Recibimos el mensaje del cliente
  92.        printf( "Conexión entrante:\n" );
  93.        printf( "------------------------------------------\n" );
  94.        int bytesMensaje = 0;
  95.        char recvbuf[ MAX_BUFFER ];
  96.        int recvbuflen = MAX_BUFFER;
  97.        do
  98.        {
  99.            bytesMensaje = recv( socketCliente, recvbuf, recvbuflen, 0 );
  100.            if ( bytesMensaje > 0)
  101.            {
  102.                recvbuf[ bytesMensaje ] = 0;
  103.                printf( "Mensaje recibido:\n" );
  104.                puts( recvbuf );
  105.                printf( "\n" );
  106.                printf("Bytes recibidos: %d\n", bytesMensaje );
  107.  
  108.                // Tambien podemos enviarle una respuesta al cliente
  109.                // En este caso le devolvemos el mensaje que nos ha enviado
  110.                bytesMensaje = send( ClientSocket, recvbuf, bytesMensaje, 0 );
  111.                if ( bytesMensaje == SOCKET_ERROR)
  112.                {
  113.                    printf("Error al enviar la respuesta: %d\n", WSAGetLastError()  );
  114.                    closesocket( socketCliente );
  115.                    break;
  116.                }
  117.                printf( "Bytes enviados: %d\n", bytesMensaje );
  118.            }
  119.            else if ( bytesMensaje == 0 )
  120.                printf( "Conexion con el cliente cerrada.\n" );
  121.            else
  122.                printf( "Error al establecer conexion con cliente: %d\n", WSAGetLastError( ) );
  123.        } while ( bytesMensaje > 0 );
  124.  
  125.        closesocket( socketCliente );
  126.    } while ( 1 );
  127.  
  128.    // En este caso el servidor no para nunca
  129.    // Si se programase una parada habria que realizar las tareas de limpieza
  130.    closesocket( socketServidor );
  131.    WSACleanup( );
  132.  
  133.    return 0;
  134. }



Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 24 Julio 2014, 14:22 pm
Lo e intentado probar pero me da numerosos fallos, las variables en C se declaran solo en la cabecera, no se pueden poner a mitad de código como ocurre en java, hay algunas variables que no se para que sirven xD que no están definidas. Luego si tengo tiempo le dedico más tiempo, y lo retoco lo que pueda, gracias.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 26 Julio 2014, 13:27 pm
Sigo pensando en el tema, me pregunto si puede ser que para enviar las variables, sea necesario enviar el login y password del servidor, primero, yo creo que no debería ser necesario pero puede erradicar ahí un posible problema, también puede ser un fallo de cabecera o que falte algo, no se nada de cabeceras HTTP, bueno esta es la que tengo, igual podemos probar con admin y pass, no se xD.

Código:
POST /index.php HTTP/1.0\r\n
Host: midominio.cam.com\r\n
//Referer: http://midominio.cam.com/index.php\r\n
Content-type: application/x-www-form-urlencoded\r\n
Content-length: 30 \r\n\r\n
nombre=post_ok&contenido=exito

Puede ser que falte algo, o sobre en la cabecera, si eso falla me pregunto si es necesario el login y password del server web para acceder a el envio de las variables que espero que no.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 26 Julio 2014, 13:33 pm
yo de ti no ponía el content-type. Por probar.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 26 Julio 2014, 19:37 pm
Ya lo he probado y también he probado a poner esto en el script php:

Código:
$nombre=$_POST["nombre"];
$contenido=$_POST["contenido"];

Pero nada no funciona, habéis probado si os va a vosotros, no se vosotros que entendéis quizás os cueste menos porque yo sin apuntes, puedo buscar en google pero apenas consigo nada.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 26 Julio 2014, 23:04 pm
prueba a hacer eso con GET. Todo como lo tienes, pero con GET. Si te va, entonces sabremos que es un fallo en el POST.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 27 Julio 2014, 11:23 am
He probado con GET, con POST, con htmlspecialchars, sin htmlspecialchars en el php, la cabecera la dejo igual, si meto cosas en la cabecera como el referer me da error,  de momento solo tengo en la cabecera HOST, Content-type, Content-length, y las variables. No sé. He visto POST que usan el agente de navegación en la cabecera y más cosas, no sé si hará falta algo de eso.


Título: Re:
Publicado por: ivancea96 en 27 Julio 2014, 14:11 pm
Pásame por mp algun dato de tu server, y si quieres, luego lo intento. Si va, te doy la cabecera. Sinó, a lo mejor es cosa del php.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: daryo en 27 Julio 2014, 14:51 pm
probaste en un servidor en localhost?
para windows recomiendo: http://www.wampserver.com/en/
para linux https://www.apachefriends.org/index.html

haz el mismo proceso de enviar por post con un navegador
en firefox con hackbar puedes enviar variables posts:
https://addons.mozilla.org/es/firefox/addon/hackbar/

luego con http headers(extension para ver cabezeras que envia el navegador) prueba copiando todas las cabezeras
https://addons.mozilla.org/es/firefox/addon/live-http-headers/

ni idea con los demas navegadores usoo firefox si no analisa el trafico con wireshark


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 27 Julio 2014, 23:46 pm
Gracias a ambos por la respuesta, te he enviado un mp ivancea, pero no me aparece en la bandeja de salida, lo he vuelto a intentar y me ha dicho que ya lo había mandado antes, pero sigue sin aparecer nada xD

Respecto a lo del servidor local veo que es una buena idea, aunque no sabemos si se comportará por igual que el server web que tengo, de todas formas mañana lo probaré haber que tal, según parece es igual que el server web, pongo contenidos en la carpeta como hacía en public_html y conecto a localhost.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 28 Julio 2014, 01:08 am
Estuve probando con mis clases http, y mirando las cabeceras del navegador, y esto es lo necesario para enviar:

Código:
POST /XXX HTTP/1.1
Host: XXX
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

nombre=archivo&contenido=info

Así debería ir. Creo que fuí yo el que antes propuso lo de quitar el content-type, así que lo siento xD


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 28 Julio 2014, 18:38 pm
Te llegaron mis mensajes privados? Es que no me aparece nada en la bandeja de entrada, he separado el script para subir archivo del index.php, esta en el directorio public_html, y se llama script.php, tiene esto:

Código:
<?php
$nombre=htmlspecialchars($_POST["nombre"]);
$contenido=htmlspecialchars($_POST["contenido"]);
$fp=fopen("./archivos/" . $nombre . ".a","at");
fwrite($fp,$contenido);
fclose($fp);
?>

Ahora conecto a ese script, lo que tengo en el post es esto:

Código:
len=strlen("nombre=post_ok&contenido=exito");
        itoa(len,cad,10);

        strcpy(buffer,"POST /script.php HTTP/1.0\r\n");
        strcat(buffer,"Host: mipagina.freedom.com\r\n");
        //strcat(buffer,"Referer: http://www.mipagina.freedom.com/index.php\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,"nombre=post_ok&contenido=exito");
        printf("%s\n",buffer);

Pero no sube archivo al ejecutar el programa sigue sin ir xd


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 28 Julio 2014, 19:03 pm
Asegúrate de que le llega. Haz que tu php por ejemplo, escriba en un archivo cuando alguien se le conecta.

Descarta el PHP. Este es correcto.

Existe la posibilidad de que no se envíe bien, no se.

Prueba a poner HTTP/1.1.

No se que puede pasar.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: daryo en 28 Julio 2014, 20:09 pm
probaste copiar todas las cabezeras del navegador? como puse en el comentario anterior


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 29 Julio 2014, 00:38 am
He probado a crear un archivo prueba.php que escribe en un archivo prueba.a de tal forma para comprobar que llega información:

Código:
<?php
$prueba=htmlspecialchars($_POST["prueba"]);
$fp=fopen("./archivos/prueba.a","wt");
fwrite($fp,$prueba);
fclose($fp);
?>

Sin éxito, puse el 1.1 y nada ni una variable coge, te llegaron los mp ivancea? xD

Ahora respecto a lo de daryo no se como va eso de las cabeceras del navegador, la verdad acabo de instalarme una extension en el filezilla que pusistes, y para que me vale eso? No pude ver ninguna cabecera de POST, de todas formas no es necesario pues el programa C debería ser capaz de enviar datos a la web sin necesidad de intermediarios.

Que cojones me voy a istalar el wire haber que sale xD...

Edito: Puedo verificar que reconoce conexiones a la ip del servidor TCP puerto 80, hay también paquetes de respuesta del server, pero no consigo encontrar la cabecera en ningún paquete.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: daryo en 29 Julio 2014, 00:52 am
calma calma xD te lo dire por pasos para las extensiones  para firefox(no hay filezillas xD)  que te pase:
 
1.una te servira para hacer la peticion post por el navegador(hackbar para verla presiona F9 dale click a enable post data pones las variables y le das execute) eso enviara por post las variables.

2. con la otra para ver las cabezeras que envia el navegador(live http header)presiona alt  en el menu herramientas live http headers  te saldra una ventanita y cuando recarges la pagina del navegador o le des execute en la extension del hackbar te mostrara todas las cabezeras

3.esas cabezeras serian las que luego copiarias tal cual en tu programa

en cuanto a lo de wireshark lo dije como opcion secundaria es un poco mas complicado pero es casi lo mismo en el wireshark en filtros le das http luego con el navegador que prefieras abres la web envias la petiicion y el paquete que la ip concuerde lo analisas.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 29 Julio 2014, 01:15 am
Aaaaamigo ya se porque no las veía porque la extensión lo que hace es mostrarte lost GET y POST que se realizan en el navegador, es decir hay que cargar al menos páginas para que aparezcan esas cabeceras, me fui a hotmail.com por ejemplo y me salieron muuchos POST y GET  :D como cosa mala, aquí pique uno:

Código:
POST / HTTP/1.1
Host: ocsp.digicert.com
User-Agent: Mozilla/5.0 (Windows XX 9.5; WOW64; rv:29.0) Gecko/20100101 Firefox/28.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Length: 115
Content-Type: application/ocsp-request
Connection: keep-alive
0q0o0M0K0I0 +

Lo que hace darme cuenta de que parece que sea necesario cosas como el agente de navegación, idioma, y demás de todas formas este que he pillado no es de "application/x-www-form-urlencoded" asi que no creo que tenga que ser en lo demás igual, bueno sigo indagando.

Edito: Nótese que esta linea:

Código:
POST / HTTP/1.1

Nosotros teníamos

Código:
POST /script.php HTTP/1.1

Haciendo referencia al archivo que ejecutará el php, allí no hace referencia a nada, quizás sea index.php por defecto, sino que php recogerá sus variables.

Edito: Acabo de usar el programa que muestra los GET y POST que me dijiste en en el mozilla xD, y probé con una busqueda en google, entonces mostraba las cabecera, wireshark también las mostraba, pero cuando ejecuto mi programa no aparece la cabecera por ningún lado. Raro.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: daryo en 29 Julio 2014, 01:30 am
es que por cada imagen que descarga por cada archivo de la web hara una peticion adicional con todo lo que ello conlleva cabeceras contenido , etc etc. en live headers te muestra arriba de las cabezeras la url
deberia estar arriva del :
Código:
POST / HTTP/1.1

ya sabiendo  la url a la que debes hacerle esa peticion sabras cuales cabeceras extraer  ;)

una alternativa a los sockets es wininet(no se como se usa jeje pero esta hecho para ser mas sencillo que manejar sockets)que sin necesidad manejar directamente el protocolo http puedes interactual con este ( ademas te permite manejar cosas como(get post cookies etc) ftp )

un ejemplo:
http://msdn.microsoft.com/en-us/library/sb35xf67.aspx#_core_create_a_very_simple_browser

edito
aunque ya estando tan cerca no vale la pena aprender a usar wininet xD


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 29 Julio 2014, 01:38 am
He cargado mi página con el mozilla y no me muestra nada elhttpheaders xD, de todas formas es normal pues tendremos que forzar la interacción  y eso yo no se como hacerlo según dijiste parece que se puede hacer con el programa pero yo no se como usarlo, sería pasarle unas variables con POST a la página con el programa y leer la cabecera que mete, bueno hasta mañana se seguirá en ello gracias.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: MinusFour en 29 Julio 2014, 02:20 am
Puedes hacer un formulario post sencillo para comprobar si tu archivo.php funciona correctamente.

Código
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title> Formulario de Prueba </title>
  5. </head>
  6. <body>
  7. <form action="archivo.php" method="POST">
  8. <input type="text" name="nombre"><br>
  9. <input type="text" name="contenido"><br>
  10. <input type="submit" value="Enviar">
  11. </form>
  12. </body>
  13. </html>

Y también modifica tu archivo php así:

Código
  1. <?php
  2. if(isset($_POST["nombre"])) {
  3. $nombre=htmlspecialchars($_POST["nombre"]);
  4. $contenido=htmlspecialchars($_POST["contenido"]);
  5. $fp=fopen("./archivos/prueba.a","wt");
  6. if($fp) {
  7. fwrite($fp,$prueba);
  8. fclose($fp);
  9. } else {
  10. echo "ERROR ABRIENDO ARCHIVO";
  11. }
  12. }
  13. ?>


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 29 Julio 2014, 09:05 am
Kaxperday, sí leí tus mensajes. fue lo que respondí en el último post, que con esos 3 fields en el header llegaba.
Usa un programa como el WPE para ver qué es lo que envía tu cliente, porque algo raro hay. Revisa cual es el content length que envía, y si es necesario, ponlo tú a mano.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 29 Julio 2014, 13:43 pm
Respecto a lo de minosfour si que funciona el php correctamente, no es necesario hacer eso, pues antes con escribir las variables en el navegador creaba el archivo y todo bien solo que ahora cambié GET por POST lo demás es igual, debería ir.

Ivancea a ti te funciono con esos 3 campos solo?, probé a descargar el WPE y al descargar me salio como archivo malicioso, desde la página web del autor, no sé lo que está claro es que no se realiza correctamente el POST algo pasa desapercibido en el cliente, pues busqué con wireshark los POST y efectivamente conectaba a la IP de la web pero no estaba la cabecera en ningún paquete, sin embargo en otros POST no relacionados si aparecía. Que puede fallar en ese programa en C me pregunto.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 29 Julio 2014, 15:15 pm
Olle olle, tu código funciona perfectamente. Si al usarlo tú, no te va, quizás sea cosa del cortafuegos, del router, o del compilador.

Ante todo sepas, que tu código va perfectamente.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 29 Julio 2014, 19:28 pm
Ahhh me alegra oír eso, yo uso codeblocks que usa gcc compiler, puede que sea algo del firewall etc, probare a meter el programa en otro ordenador haber si le funciona.

Ahora bien, ya esta resuelto algo de vital importancia, como es enviar variables, ahora la idea de subir archivos como sería no hay alguna cabecera para mandar archivo directamente añadiendo algún campo en la cebecera, o tengo que ir cargando variables y subiendolas poco a poco, además como puedo controlar si hay posibles errores, me vendría muy bien saber algo de esto, muchas gracias.

PD: Ya os comentaré si me funcionó en otro ordenador.
PD: MIL gracias ivancea  :rolleyes:


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 29 Julio 2014, 19:32 pm
Tal como lo tienes, no necesitarías cambiar nada.
Primero, lees el tamaño del archivo, y se lo sumas al contentlength. Envías la cabecera.
Luego, abres el archivo en stream, y vas enviando todos los bytes. Es solo eso.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 29 Julio 2014, 20:18 pm
mmm pero si el archivo tiene más caracteres de los que la URL tiene por límite?, cuando hacia get escribiendo las variables en navegador había limite.

ok saco los bytes del archivo, los paso al content length, pero no he entendido eso de abrir el archivo en stream xD lo demás si.

Edito: te refieres a meter todo el contenido del archivo en la cadena?. Otra cosilla caracteres como por ejemplo un espacio tendría que enviarlo como %24 no? gracias


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 29 Julio 2014, 20:34 pm
Si no haces lo de specialchars, puedes enviar todo sin cifrar. simplemente, lo envías.
Con el método POST no tendrás problemas de tamaño en principio.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 29 Julio 2014, 22:10 pm
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.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 29 Julio 2014, 22:38 pm
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.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 30 Julio 2014, 12:02 pm
Supongo que esto debería funcionar:

Código:
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.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 30 Julio 2014, 12:08 pm
Solo tienes que mandar 1 post. Primero la cabecera entera, y luego lees el archivo


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 30 Julio 2014, 12:19 pm
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  ;-)


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 30 Julio 2014, 12:58 pm
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.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: daryo en 30 Julio 2014, 14:55 pm
mejor codificalo en base64 asi no tendras caracteres raros y en el servidor con php lo decodificas


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 30 Julio 2014, 15:00 pm
No hace falta codificar. Dado que es un archivo, los datos y los "caracteres raros" pasan sin problema.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 30 Julio 2014, 16:08 pm
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.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 30 Julio 2014, 17:23 pm
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
  1. char arr[1024];
  2. ifstream f("...",ios::binary);
  3. while(!f.eof()){
  4.    f.read(arr,1024);
  5.    if(f.eof())
  6.        serv.send(0,string(arr,f.gcount()));
  7.    else
  8.        serv.send(0,string(arr,1024));
  9. }

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
  1. void setBlocking(SOCKET sock, bool blocking){
  2.    u_long block = blocking ? 0 : 1;
  3.    ioctlsocket(sock, FIONBIO, &block);
  4. }

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

Bueno, creo que eso es todo.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 8 Agosto 2014, 23:49 pm
Bueno aqui sigo, semanas después he probado en TRES ordenadores distintos y no he conseguido hacer funcionar el programa, no consigo enviar el POST.

Código:

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define ip "67.233.113.145"

int main()
{
    WSADATA wsa;
    struct sockaddr_in direccion;
    int sock, puerto=80,len;
    char buffer[200],cad[20];
    ssize_t n;

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

    if((sock=socket(AF_INET,SOCK_STREAM,0))==-1 )
    {
        printf("Problema al crear el socket");
        getch();
        exit(0);
    }
    else
    {
        direccion.sin_family=AF_INET;
        direccion.sin_port=htons(puerto);
        direccion.sin_addr.s_addr=inet_addr(ip);


        len=strlen("nombre=nombre123correcto&contenido=123456");
        itoa(len,cad,10);
        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
        strcat(buffer,"Host: mipaginaweb.free33.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");
        strcat(buffer,"nombre=nombre123correcto&contenido=123456");
        printf("%s\n",buffer);

        if(connect(sock,(struct sockaddr*)&direccion,sizeof(direccion))==-1)
        {
            printf("Error al conectar.\n");
            getch();
            exit(0);
        }
        printf("Conectado correctamente.\n");

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

Así que me estoy preguntando como hiciste tu para que te funcionará el código he probado a compilarlo con codeblocks y con devcpp, pasame el código ocultando datos de IP y de host, porque yo no lo entiendo xD, he probado en windows 7 y 8, y nada OMG


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 9 Agosto 2014, 00:01 am
Pasó mucho tiempo, ya no me acuerdo xd
Pero lo dicho. Intenta conectarte sin POST. Si se realiza correctamente la conexión, y se realiza correctamente una petición básica, prueba con POST.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 9 Agosto 2014, 00:04 am
Conectarme me conecto (crea socket, connect etc), pero eso de hacerlo sin POST ni idea, el caso si tienes el código por ahí pásamelo por privado si puedes, AUNQUE no veo ningún mensaje no se que me pasa con la bandeja de entrada, te mande 2 o 3 mensajes y la bandeja de salida está vacía, y de entrada igual, así que estos correos no parecen funcionar mucho xd

Edito: xD ya lo siento revivir el tema tras tanto tiempo, pero es que aún no lo he conseguido hacer conectar y es muy frustrante :"""(


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 9 Agosto 2014, 00:16 am
Me refiero a que envíes una petición GET sencilla y que el php pues haga un log. Asegurarte de que se envían datos.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 9 Agosto 2014, 00:32 am
Así es compa mira, he cambiado en el PHP el POST, por GET, he escrito en la url las variables y se ha creado un archivo con nombre y contenido correctamente.

Es decir el código funciona con el GET, ahora bien lo cambio por POST, uso el programa dice que manda el send con el POST pero no aparece ningún archivo, quizás sea problema de la IP, yo uso la que devuelve el ping al dominio web supongo que sera esa, por lo demás nada nuevo, ah si puse 1.1 en el HTTP

edito: lo estoy probando y nada, no hay manera


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 9 Agosto 2014, 00:41 am
Así por probar, restale 2 al lenght, a ver si va a ser que el lenght se pone erróneamente más grande, y por eso el servidor se queda en espera.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Kaxperday en 9 Agosto 2014, 00:44 am
OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

SIIIIIIIIIIIIIIIIIIIIIIIII, ORGASMO. ADIVINA...

EL CÓDIGO QUE COPIÉ TENÍA PEQUEÑOS ERRORES, PUES ESTOY CON OTRO ORDENADOR Y COPIE EL DE ESTE FORO, LE FALTABA EL HTTP/1.1 YYYY

QUE HAY QUE METER DOS \r\n TRAAS LA CABECERA NO UNO :DDDD

MIL GRACIAS, POR TU ATENCIÓN Y PACIENCIA, PARA LO QUE QUIERAS AQUÍ ESTOY.


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: Optimussky en 29 Agosto 2017, 20:43 pm
Hola!! soy nuevo en este foro(hoy me he registrado)

Tengo una pregunta.

Y si fuera alrevés?

Tenemos un scrip en C(trabajamos en Arduino) y desde php se envía una URL y quiero obtener los valores de la cadena para tomarlos y darles ese valor al mover un motor, el punto es que lo intentamos haciendo substrings y tomando de la cadena los valores numéricos que darán mayor velocidad o no al motor.

Hay alguna otra forma para obtener los valores de la URL que no sea cortar la cadena y tomar los valores(como que hace crash y se vuelve lento el asunto)


Título: Re: Ayuda envío archivo a web con C vía http
Publicado por: ivancea96 en 29 Agosto 2017, 21:09 pm
Este tema es dehace 3 años ._.
No se reabren temas antiguos.

~Bienvenido al foro~
Pero crea otro tema con tu problema.

Y ya si creas otro tema, explica mejor esto que comentas.

Citar
desde php se envía una URL y quiero obtener los valores de la cadena para tomarlos y darles ese valor al mover un motor
Se envía una URL - valores de la cadena - valores a un motor
What