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

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

0 Miembros y 10 Visitantes están viendo este tema.

Kaxperday

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 ;)
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

No es "write". Es "Send".

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.

Kaxperday

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:

<?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:


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
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

Estás poniendo en el php $_GET[], cuando debería ser $_POST[]

Kaxperday

Gracias eso he puesto lo demás esta todo igual el programa se ejecuta bien pero sigue sin enviar datos :"""(((( 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.

eferion

no estás enviando nada bajo la variable "contenido"... ¿no será que te está creando el archivo pero lo deja vacío?

Kaxperday

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.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

eferion

Estás seguro de que tienes permisos de escritura para la ruta del archivo?

Kaxperday

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:


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?
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

eferion

#19
Una pregunta tonta... en qué punto concreto has inicializado el socket. Algo del tipo:

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.