Autor
|
Tema: Ayuda envío archivo a web con C vía http (Leído 26,314 veces)
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
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
|
|
« Última modificación: 24 Julio 2014, 01:06 am por Kaxperday »
|
En línea
|
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
Desconectado
Mensajes: 3.412
ASMático
|
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.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
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.
|
|
« Última modificación: 24 Julio 2014, 01:45 am por Kaxperday »
|
En línea
|
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
Desconectado
Mensajes: 1.248
|
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"); 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 ,"nombre=nombre123correcto&contenido=123456");
Se debería parecer más a esto: char* contenido = "nombre=nombre123correcto&contenido=123456"; 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: ");
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. #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 ); 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" ); 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; }
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 702
The man in the Middle
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 3.412
ASMático
|
yo de ti no ponía el content-type. Por probar.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 3.412
ASMático
|
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.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
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.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Messenger.UIAutomation ¿Como envio un archivo?
Scripting
|
markus_bitman
|
3
|
3,344
|
2 Febrero 2010, 08:58 am
por Tyrz
|
|
|
[C] Envió de archivo binario por HTTP
Programación C/C++
|
yeikos
|
6
|
4,399
|
4 Mayo 2010, 23:45 pm
por yeikos
|
|
|
¿Como genero un archivo con un nombre por defecto y lo envió por ftp?
Scripting
|
sabeeee
|
3
|
2,742
|
4 Febrero 2011, 19:35 pm
por Edu
|
|
|
Como automatizar el envio de cabeceras HTTP ???
« 1 2 »
Desarrollo Web
|
cybero
|
10
|
6,471
|
28 Abril 2012, 18:16 pm
por _teiki
|
|
|
Envio de archivo sin nombre Telegram C#
.NET (C#, VB.NET, ASP)
|
rigorvzla
|
2
|
3,623
|
27 Junio 2018, 04:29 am
por rigorvzla
|
|