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

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

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

Kaxperday

Lo inicializo en la sentencia if, una vez ejecuta el else ya debería haber creado el socket.


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.


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


Kaxperday

Hago un ping a mi dominio web de ahí obtengo la IP que la defino como variable global en el cliente en C.
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

y asumo que has comprobado que el valor almacenado en esa variable es el correcto, cierto?

Kaxperday

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

#25
Cita de: Kaxperday en 23 Julio 2014, 14:54 PM
Edito: ¿No ves que si? OMG antes de preguntar dedica un minisegundo a mirar el código

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.

Cita de: 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.

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:

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

ivancea96

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.

Kaxperday

#27
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 :

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:

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

Cita de: 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.

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.

Cita de: Kaxperday en 23 Julio 2014, 16:28 PM
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.

Cita de: Kaxperday en 23 Julio 2014, 16:28 PM
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.

ivancea96

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