Socket c++ server y navegador web (chrome)...

Iniciado por shiro51, 16 Abril 2012, 23:23 PM

0 Miembros y 1 Visitante están viendo este tema.

shiro51

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


Gracias.

<[(x)]>



     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
<[(x)]>

shiro51

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

<[(x)]>

#3

 El código tendría que funcionar...
        lo acabo de probar y funciona bien, querés agregarle mas cosas? no entiendo el problema...

<[(x)]>

shiro51

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

shiro51

#5
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;
}

shiro51

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