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

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

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.

Kaxperday

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


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


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

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:

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


Se debería parecer más a esto:


        char* contenido = "nombre=nombre123correcto&contenido=123456";
        len = strlen( contenido );
        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, contenido);
        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.

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

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


#define MAX_BUFFER 512

// OJO que los puertos inferiores a 1024 estan reservados, lo mismo tienes que cambiar el puerto
#define PUERTO_SERVIDOR "80"

int main( void )
{
    WSADATA wsaData;
   
    // Inicializamos WinSock
    int errorCode = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
    if ( errorCode != 0 )
   {
        printf("Error en WSAStartup: %d\n", errorCode );
        getch( );
        return 1;
    }

    struct addrinfo configInicial;
    ZeroMemory( &configInicial, sizeof( configInicial) ); // IMPORTANTE limpiar la memoria
    configInicial.ai_family   = AF_INET;
    configInicial.ai_socktype = SOCK_STREAM;
    configInicial.ai_protocol = IPPROTO_TCP;
    configInicial.ai_flags    = AI_PASSIVE;

    // Resolver la dirección IP y el puerto del servidor
    struct addrinfo *configServidor= NULL;
    errorCode = getaddrinfo( NULL, PUERTO_SERVIDOR, &configInicial, &configServidor );
    if ( errorCode != 0 )
    {
        printf("Error en getaddrinfo: %d\n", errorcode );
        WSACleanup( ); // IMPORTANTE reiniciar WinSock
        return 1;
    }

    // Crear socket de escucha
    SOCKET socketServidor= INVALID_SOCKET;
    socketServidor= socket( configServidor->ai_family, configServidor->ai_socktype, configServidor->ai_protocol );
    if ( socketServidor== INVALID_SOCKET )
    {
        // Fijate que podemos obtener el codigo de error al crear el socket
        printf("Error al crear socket de escucha: %ld\n", WSAGetLastError( ) );

        // Hay que limpiar la memoria
        freeaddrinfo( configServidor );

        // Y reiniciar WinSock
        WSACleanup();
        return 1;
    }

    // Se enlaza el socket del servidor para que use la ip y el puerto solicitado
    errorcode = bind( socketServidor, configServidor->ai_addr, (int)configServidor->ai_addrlen );
    if ( errorCode == SOCKET_ERROR)
    {
        printf("Error en bind: %d\n", WSAGetLastError( ) );

        // Liberamos recursos
        freeaddrinfo( configServidor );
        closesocket( socketServidor );
        WSACleanup( );
        return 1;
    }

    // Ya no necesitamos esta configuracion, el socket esta creado
    freeaddrinfo( configServidor );

    // Dejamos al socket esperando conexiones
    errorCode = listen( socketServidor , SOMAXCONN );
    if (errorCode == SOCKET_ERROR)
    {
        printf( "Error listen: %d\n", WSAGetLastError( ) );
        closesocket( socketServidor);
        WSACleanup( );
        return 1;
    }

    // Procesamos las peticiones que nos llegan
    do
    {
        SOCKET socketCliente= INVALID_SOCKET;
        socketCliente= accept( socketServidor, NULL, NULL );
        if ( socketCliente== INVALID_SOCKET)
        {
            printf( "Error en conexion entrante: %d\n", WSAGetLastError( ) );
            closesocket( socketServidor );
            WSACleanup( );
            return 1;
        }

        // Recibimos el mensaje del cliente
        printf( "Conexión entrante:\n" );
        printf( "------------------------------------------\n" );
        int bytesMensaje = 0;
        char recvbuf[ MAX_BUFFER ];
        int recvbuflen = MAX_BUFFER;
        do
        {
            bytesMensaje = recv( socketCliente, recvbuf, recvbuflen, 0 );
            if ( bytesMensaje > 0)
            {
                recvbuf[ bytesMensaje ] = 0;
                printf( "Mensaje recibido:\n" );
                puts( recvbuf );
                printf( "\n" );
                printf("Bytes recibidos: %d\n", bytesMensaje );

                // Tambien podemos enviarle una respuesta al cliente
                // En este caso le devolvemos el mensaje que nos ha enviado
                bytesMensaje = send( ClientSocket, recvbuf, bytesMensaje, 0 );
                if ( bytesMensaje == SOCKET_ERROR)
                {
                    printf("Error al enviar la respuesta: %d\n", WSAGetLastError()  );
                    closesocket( socketCliente );
                    break;
                }
                printf( "Bytes enviados: %d\n", bytesMensaje );
            }
            else if ( bytesMensaje == 0 )
                printf( "Conexion con el cliente cerrada.\n" );
            else
                printf( "Error al establecer conexion con cliente: %d\n", WSAGetLastError( ) );
        } while ( bytesMensaje > 0 );

        closesocket( socketCliente );
    } while ( 1 );

    // En este caso el servidor no para nunca
    // Si se programase una parada habria que realizar las tareas de limpieza
    closesocket( socketServidor );
    WSACleanup( );

    return 0;
}



Kaxperday

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

Kaxperday

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.


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.
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 de ti no ponía el content-type. Por probar.

Kaxperday

Ya lo he probado y también he probado a poner esto en el script php:


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

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.

Kaxperday

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