Hola buenas noches, vengo aqui a solicitar algo de información ya que no encuentro en Internet nada relacionado...
Me meti en el desarrollo de sockets en c++, y consegui conectar el navegador web al server socket, (muy facil...), pero ahora no se como responderle al navegador web y enviarle la informacion necesaria y el html correspondiente, espero que me podais ayudar... ya que esto es un problema demasiado facil y me da verguenza publicar algo tan tonto... xDD
Dejo imagen de la cabecera http y el server...
(http://i39.tinypic.com/124cuuq.png)
Gracias.
Se necesita mas información para poder ayudarte, por lo q veo estas usando Windows, pero que api usas?
.... pone un poco de código, algo como para q sepamos donde estas.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740149%28v=vs.85%29.aspx
Este es el codigo completo, apenas lo toque del original, porque estuve comprimiendo el cliente y el server lo he dejado un poco apartado hasta ahora xDDD
#include <winsock2.h> //la cabezera para usar las funciones de winsock
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSADATA wsa;
SOCKET sock;
struct sockaddr_in local;
int len=0;
char Buffer[1024];
char HTML[1024] = "<html> <body> Hola como estas?</body></html>";
//Inicializamos
WSAStartup(MAKEWORD(2,0),&wsa);
//Creamos el socket
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//defnimos dirección por defecto, ipv4 y el puerto 9999
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(9999);
//asociamos el socket al puerto
if (bind(sock, (SOCKADDR*) &local, sizeof(local))==-1)
{
printf("error en el bind\n");
return -1;
}
//ponemos el socket a la escucha
if (listen(sock,1)==-1)
{
printf("error en el listen\n");
return -1;
}
len=sizeof(struct sockaddr);
//hay una conexión entrante y la aceptamos
sock=accept(sock,(sockaddr*)&local,&len);
while (len!=0) //mientras estemos conectados con el otro pc
{
len=recv(sock,Buffer,1023,0); //recibimos los datos que envie
if (len>0) //si seguimos conectados
{
Buffer[len]=0; //le ponemos el final de cadena
puts(Buffer); //imprimimos la cadena recibida
if(strcmp (Buffer,"12412412412Hola\n") == 0)
{
puts("Muy bien!");
send(sock, inet_ntoa(local.sin_addr), strlen(inet_ntoa(local.sin_addr)), 0);
}
send(sock, "HTTP/1.1 200 OK\r\n", strlen("HTTP/1.1 200 OK\r\n"), 0);
send(sock, "Content-Type: text/html\r\n", strlen("Content-Type: text/html\r\n"), 0);
send(sock, "Content-Length: 1024\r\n", strlen("Content-Length: 1024\r\n"), 0);
send(sock, "\r\n", strlen("\r\n"), 0);
send(sock, "<html><body>Hola mundo</body></html>", strlen("<html><body>Hola mundo</body></html>"), 0);
}
}
return 0;
}
El código tendría que funcionar...
lo acabo de probar y funciona bien, querés agregarle mas cosas? no entiendo el problema...
A mi no me funciona, el navegador se conecta me envia su cabecera le envio la mia pero no me muestra el "Hola mundo" en el navegador web...
Quiero que chrome por ejemplo se conecte a mi server y le envie el html y se muestre en el navegador el html que envia mi server...
Mini avance... si le envio lo que me envia el navegador... se queda esperando procesando informacion... he probado mandando lo mismo que el navegador y mandando:
strncat (HTML, "GET /index.html HTTP/1.1\n", strlen(HTML) + strlen("GET /index.html HTTP/1.1\n"));
strncat (HTML, "Accept: */*\n", strlen(HTML) + strlen("Accept: */*\n"));
strncat (HTML, "Accept-Language: es\n", strlen(HTML) + strlen("Accept-Language: es\n"));
strncat (HTML, "Accept-Encoding: gzip, deflate\n", strlen(HTML) + strlen("Accept-Encoding: gzip, deflate\n"));
strncat (HTML, "User-Agent: Mozilla/5.0 (compatible; MSIE 5.01; Windows NT)\n", strlen(HTML) + strlen("User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)\n"));
strncat (HTML, "Host: 127.0.0.1n", strlen(HTML) + strlen("Host: 127.0.0.1\n"));
strncat (HTML, "Connection: Keep-Aliven\n", strlen(HTML) + strlen("Connection: Keep-Aliven\n"));
Pero falta algo...
#include <winsock2.h> //la cabezera para usar las funciones de winsock
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSADATA wsa;
SOCKET sock;
struct sockaddr_in local;
int len=0;
char Buffer[1024];
char HTML[1024] = "";
//strncat (HTML, "GET /index.html HTTP/1.1\r\n", strlen(HTML) + strlen("GET /index.html HTTP/1.1\r\n\n"));
//strncat (HTML, "Accept: */*\r\n", strlen(HTML) + strlen("Accept: */*\r\n"));
//strncat (HTML, "Accept-Language: es\r\n", strlen(HTML) + strlen("Accept-Language: es\r\n"));
//strncat (HTML, "Accept-Encoding: gzip, deflate\r\n", strlen(HTML) + strlen("Accept-Encoding: gzip, deflate\r\n"));
//strncat (HTML, "User-Agent: Mozilla/5.0 (compatible; MSIE 5.01; Windows NT)\r\n", strlen(HTML) + strlen("User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)\r\n"));
//strncat (HTML, "Host: 127.0.0.1\r\n", strlen(HTML) + strlen("Host: 127.0.0.1\r\n"));
//strncat (HTML, "Connection: Keep-Aliven\r\n\r\n\n", strlen(HTML) + strlen("Connection: Keep-Aliven\r\n\r\n"));
//strncat (HTML, "<html><body>Hola mundo</body></html>", strlen(HTML) + strlen("<html><body>Hola mundo</body></html>"));
strncat (HTML, "HTTP/1.1 200 OK\r\n", strlen(HTML) + strlen("HTTP/1.1 200 OK\r\n"));
strncat (HTML, "GET /index.html HTTP/1.1\r\n", strlen(HTML) + strlen("GET /index.html HTTP/1.1\r\n\n"));
strncat (HTML, "Accept: */*\r\n", strlen(HTML) + strlen("Accept: */*\r\n"));
strncat (HTML, "Cache-Agent: max-age=0\r\n", strlen(HTML) + strlen("Cache-Agent: max-age=0\r\n"));
strncat (HTML, "Accept-Language: es-ES\r\n", strlen(HTML) + strlen("Accept-Language: es\r\n"));
strncat (HTML, "Accept-Encoding: gzip, deflate\r\n", strlen(HTML) + strlen("Accept-Encoding: gzip, deflate\r\n"));
strncat (HTML, "User-Agent: Mozilla/5.0 (compatible; MSIE 5.01; Windows NT)\r\n", strlen(HTML) + strlen("User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)\r\n"));
strncat (HTML, "Host: 127.0.0.1\r\n", strlen(HTML) + strlen("Host: 127.0.0.1\r\n"));
strncat (HTML, "Connection: Keep-Aliven\r\n", strlen(HTML) + strlen("Connection: Keep-Aliven\r\n"));
strncat (HTML, "Content-Type: text/html\r\n\r\n", strlen(HTML) + strlen("Content-Type: text/html\r\n\r\n"));
int num = 0;
//Inicializamos
WSAStartup(MAKEWORD(2,0),&wsa);
//Creamos el socket
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//defnimos dirección por defecto, ipv4 y el puerto 9999
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(9999);
//asociamos el socket al puerto
if (bind(sock, (SOCKADDR*) &local, sizeof(local))==-1)
{
printf("error en el bind\n");
return -1;
}
//ponemos el socket a la escucha
if (listen(sock,1)==-1)
{
printf("error en el listen\n");
return -1;
}
len=sizeof(struct sockaddr);
//hay una conexión entrante y la aceptamos
sock=accept(sock,(sockaddr*)&local,&len);
while(len >= -1)
{
len=recv(sock,Buffer,1023,0); //recibimos los datos que envie
if (len>0) //si seguimos conectados
{
Buffer[len]=0; //le ponemos el final de cadena
puts(Buffer); //imprimimos la cadena recibida
send(sock, HTML, strlen(HTML), 0);
send(sock, "<html><body>Hola mundo</body></html>", strlen("<html><body>Hola mundo</body></html>"), 0);
puts(HTML);
if(strcmp (Buffer,"12412412412Hola\n") == 0)
{
puts("Muy bien!");
send(sock, inet_ntoa(local.sin_addr), strlen(inet_ntoa(local.sin_addr)), 0);
}
}
}
return 0;
}
#include <iostream> //pause...
#include <stdio.h> //gets printf...
#include <string.h> //if
#include <time.h>
#include <process.h>
#include <winsock2.h> //sockets
#pragma comment(lib,"ws2_32.lib")
SOCKET sock;
char Buffer[1024];
char HTML[1024];
void wait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}
void thread(void *arg)
{
}
int main()
{
WSADATA wsa;
struct sockaddr_in direc;
int conex;
int len = 0;
strncat (HTML, "GET /index.php HTTP/1.1 \r\n", strlen("GET /index.html HTTP/1.1 \r\n"));
strncat (HTML, "Host: elhacker.net:80\r\n", strlen("Host: elhacker.net:80\r\n"));
strncat (HTML, "Connection: keep-alive\r\n", strlen("Connection: keep-alive\r\n"));
strncat (HTML, "User-Agent: Mozilla/5.0 <Windows NT 6.1> AppleWebKit/535.19 <KHTML, Like Gecko>\r\n", strlen("User-Agent: Mozilla/5.0 <Windows NT 6.1> AppleWebKit/535.19 <KHTML, Like Gecko>\r\n"));
strncat (HTML, "Chrome/18.0.1025.162 Safari/535.19\r\n", strlen("Chrome/18.0.1025.162 Safari/535.19\r\n"));
strncat (HTML, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n", strlen("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"));
strncat (HTML, "Accept-Encoding: gzip,deflate,sdch\r\n", strlen("Accept-Encoding: gzip,deflate,sdch\r\n"));
strncat (HTML, "Accept-Language: es-ES,es;q=0.8\r\n", strlen("Accept-Language: es-ES,es;q=0.8\r\n"));
strncat (HTML, "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n", strlen("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"));
WSAStartup(MAKEWORD(2,2),&wsa);
direc.sin_family=AF_INET;
direc.sin_port=htons(80);
direc.sin_addr = *((struct in_addr *)gethostbyname("46.105.119.93")->h_addr);
memset(direc.sin_zero,0,8);
if ((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)
{
printf("Error al crear el socket");
return -1;
}
if ((conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr)))==-1)
{
printf("No se ha podido conectar\n");
fgets(Buffer,1023, stdin);
return -1;
}else{
puts("conexion establecida...");
//_beginthread(thread, 5, 0);
}
while (len!=-1)
{
puts(HTML);
send(sock, HTML, strlen(HTML), 0);
recv(sock,Buffer,1023,0);
puts(Buffer);
system("pause");
return 0;
}
return 0;
}
Con este envio una cabecera como si fuera el navegador a un server de internet, y espero su cabecera http para saber como debe ser la mia, pero el problema es que "imitando" a chrome con la cabecera que el me manda, me dice 400 bad request, request header field is missing ":"
A ver si me podeis decir el problema...