Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: OmarHack en 26 Mayo 2013, 13:56 pm



Título: Código fuente de Lynx
Publicado por: OmarHack en 26 Mayo 2013, 13:56 pm
Si alguien tiene el código fuente le agradecería que me lo pasara. Preferentemente lo quiero para Windows 32 aun que si es para otro o.s. también me sirve.
Lo quiero para hacer un navegador web así que si tenéis otro que me pueda servir también lo agradecería. A ser posible no muy complejo.
Un saludo!


Título: Re: Código fuente de Lynx
Publicado por: lapras en 26 Mayo 2013, 14:54 pm
Esta es la página oficial de lynx: http://lynx.isc.org/lynx2.8.7/index.html (http://lynx.isc.org/lynx2.8.7/index.html)


Título: Re: Código fuente de Lynx
Publicado por: OmarHack en 26 Mayo 2013, 15:08 pm
Gracias, ya la mirara antes de crear el tema y no soy capaz de sacarlo de ahí no hay más que redirecciones a otras páginas y no encuentro el source ni a palos.  :xD
Un saludo.


Título: Re: Código fuente de Lynx
Publicado por: mr.blood en 26 Mayo 2013, 16:38 pm
http://www.portalhacker.net/index.php/topic,123755.msg611545.html

Es lo básico.

Sa1uDoS


Título: Re: Código fuente de Lynx
Publicado por: lapras en 26 Mayo 2013, 17:12 pm
Si hombre, el código fuente está en zip.
http://lynx.isc.org/lynx2.8.7/lynx2.8.7.zip (http://lynx.isc.org/lynx2.8.7/lynx2.8.7.zip)
El contenido que buscas debe de estar en el directorio WWW/Library/Implementation.

¿No es eso lo que estas buscando?


Título: Re: Código fuente de Lynx
Publicado por: OmarHack en 26 Mayo 2013, 17:37 pm
Siii, me imaginaba menos código y en menos archivos... Tiene más carpetas el kernel de linux xDDDD
Muchas gracias aún que no me sirva :xD
¿No sabrás de un navegador que venga como dios manda en un archivo .cpp de 300 lineas no?
Encontré uno en Qt 4 pero yo tengo Qt 5 y no puedo compilarlo  :-(   


Título: Re: Código fuente de Lynx
Publicado por: lapras en 26 Mayo 2013, 18:09 pm
Es que lynx aunque parezca un navegador sincillo es muy completo.
No conozco ningún navegador tan pequeño.
Lo que te puedo decir es que para hacer un navegador sencillo sólo tienes que saber un protocolo que es http.
Y dentro de http tienes que saber hacer 2 cosas:

1) Enviar una petición
Las peticiones en http tienen esta estructura:
Código:
GET /index.html HTTP/1.1
 Host: www.example.com
 User-Agent: nombre-cliente
 [Línea en blanco]

En resumen lo que debes hacer es crear un socket TCP, conectarlo a el servidor web que especifique el usuario y por último enviar la petición http.

2) Interpretar una respuesta.

Interpretar la respuesta del servidor será un pelín mas difícil.
Tiene esta estructura:

Código:
HTTP/1.1 200 OK
Date: Fri, 31 Dec 2003 23:59:59 GMT
Content-Type: text/html
Content-Length: 1221

<html>
<body>
<h1>Página principal de tuHost</h1>
(Contenido)
  .
  .
  .
</body>
</html>

Si la primera linea te dice OK, entonces esta es la respuesta que queremos. Si no lo es, tenemos que enviar la petición usando otra version de http.
Ya ves que te envían cosas como la fecha(normalmente hay mas cosas). Para un navegador básico podemos ignorar todo esto y quedarnos con "Content-Length:".
A partir de eso sabes lo grande que es lo que viene a continuación.

Bien, para empezar puedes detectar con un bucle todas las tags <p> y </p> que indican que hay texto entre ellas.
Entonces imprimes por pantalla lo que hay entre todas las tags <p> y </p>.
Y con eso ya tendrias un navedor web tan simple que no puede existir algo más simple. xD

Más información en: http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol (http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol)
Guia de programación sockets C: http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html (http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html)

Y otra cosa, si pillas el wireshark y te pones a capturar tráfico http aprenderás cómo funciona http en un periquete.


Título: Re: Código fuente de Lynx
Publicado por: OmarHack en 26 Mayo 2013, 18:24 pm
Muchísimas gracias!!! En breve me pongo a ello. Me has ayudado muchísimo.
Pd: A ver que sale.  :silbar:
Pd2: La verdad es que me esperaba que fuera más sencillo... Como engañan las apariencias.
Un saludo!


Título: Re: Código fuente de Lynx
Publicado por: lapras en 26 Mayo 2013, 18:54 pm
¿Cómo llevas la programación de sockets?
Si sabes programar sockets TCP más o menos bien no te costará mucho :)


Título: Re: Código fuente de Lynx
Publicado por: OmarHack en 26 Mayo 2013, 20:01 pm
Apenas los he tocado, leeré algún manual para manejarlos bien y venga! :)


Título: Re: Código fuente de Lynx
Publicado por: lapras en 26 Mayo 2013, 20:25 pm
Pues mírate el manual que te he dicho. Lo bueno que tiene es que la primera parte va "al grano", sockets TCP sin opciones ni cosas que compliquen el objetivo. El resto explica todos los detalles de los socket incluso los que no son TCP.


Título: Re: Código fuente de Lynx
Publicado por: OmarHack en 26 Mayo 2013, 20:34 pm
Gracias de nuevo me has echo medio trabajo! Si te puedo ayudar en algo no dudes en pedírmelo  :silbar:


Título: Re: Código fuente de Lynx
Publicado por: lapras en 26 Mayo 2013, 21:13 pm
De nada hombre.  ;)
Se me había olvidado que querías programar para win32.
Tengo una mala noticia(tampoco es tan mala), los sockets no están estandarizados y por lo tanto no son multiplataforma.
El manual que te he pasado es estupendo pero tiene la pega de que se centra en entornos Unix(Posix standard).
No te desesperes. En la wiki de elhacker.net hay un tutorial que cubre los sockets Unix y windows.
http://wiki.elhacker.net/programacion/cc/articulos/introducion-a-los-sockets-en-ansi-c (http://wiki.elhacker.net/programacion/cc/articulos/introducion-a-los-sockets-en-ansi-c)

Si quisieras hacer tu navegador multiplataforma tendrias que hacerlo mediante #ifdef's.
Otra alternativa sería usar otras librerías que si que son multiplataforma, como por ejemplo:

-boost -> la famosa boost! concretamente boost::asio
-NetLink Sockets C++ Library

A ver si acabo los exámenes y puedo ponerme a hacer código  >:(


Título: Re: Código fuente de Lynx
Publicado por: OmarHack en 26 Mayo 2013, 21:31 pm
Voy a mirarlos multiplataforma mejor a ver si doy echo un navegador portable jajaja.
No te quejes por los exámenes que yo ni tengo el grado medio. :-\ (¿Fijo que de la uni no?)
Suerte con ellos!!


Título: Re: Código fuente de Lynx
Publicado por: lapras en 6 Julio 2013, 01:13 am
He acabado los examenes.
Aquí esta el código:

Código
  1. /*Text based web browser*/
  2.  
  3. #include <string>
  4. #include <iostream>
  5. #include <boost/asio.hpp>
  6.  
  7. using namespace std;
  8.  
  9. string get_formated_web(string);
  10. string getWeb(string);
  11. string getPage(string);
  12.  
  13. int main(int argv, char **argc){
  14.  
  15. if(argv==2){
  16. string web=getWeb(string(argc[1]));
  17. cout<<"web: "<<web<<endl;
  18. string page=getPage(string(argc[1]));
  19. cout<<"page: "<<page<<endl;
  20.  
  21. boost::asio::ip::tcp::iostream stream;
  22. stream.expires_from_now(boost::posix_time::seconds(60));
  23. stream.connect(web, "http");
  24. stream << "GET "<<page<<" HTTP/1.0\r\n";
  25. stream << "Host: "<< web <<"\r\n";
  26. stream << "Accept: */*\r\n";
  27. stream << "Connection: close\r\n\r\n";
  28. stream.flush();
  29.  
  30. stringstream codestream;
  31. codestream<<stream.rdbuf();
  32. string htmlsource( codestream.str() );
  33.  
  34. string formatedweb=get_formated_web(htmlsource);
  35. std::cout << formatedweb;
  36. }
  37. else{
  38. cout<<"Wrong arguments."<<endl
  39. <<"Usage: http www.webpage.com"<<endl;
  40. }
  41. }
  42.  
  43.  
  44. /* given: www.webpage.com/page.html */
  45. /* returns: www.webpage.com */
  46. string getWeb(string a){
  47. string web;
  48. for(int i=0;i<a.size();i++){
  49. if(a[i]==':'){
  50. web+=a[i];
  51. if(i+2<a.size()){
  52. if(a[i+1]=='/' && a[i+2]=='/'){
  53. web+="//";
  54. i+=2;
  55. }
  56. }
  57. }
  58. else if(a[i]=='/'){
  59. return web;
  60. }
  61. else{
  62. web+=a[i];
  63. }
  64. }
  65. return web;
  66. }
  67.  
  68. /* given: www.webpage.com/page.html */
  69. /* returns: /page.html */
  70. string getPage(string a){
  71. string page;
  72. bool found=false;
  73. for(int i=0;i<a.size();i++){
  74. if(found){
  75. page+=a[i];
  76. }
  77. else{
  78. if(a[i]==':'){
  79. if(i+2<a.size()){
  80. if(a[i+1]=='/' && a[i+2]=='/') i+=2;
  81. }
  82. }
  83. else if(a[i]=='/'){
  84. page+='/';
  85. found=true;
  86. }
  87. else{}
  88. }
  89. }
  90.  
  91. if(page=="") return "/";
  92. return page;
  93. }
  94.  
  95.  
  96. /* given: html source code */
  97. /* returns: formatted text webpage */
  98. string get_formated_web(string unformated){
  99. return unformated;
  100. }

No es un navegador completo pero espero que se vea clara la idea principal.
Lo que hacemos es imprimir el código fuente html.
La función get_formated_text() pretende traducir el html a el text legible.

Por ejemplo si le pasas:
Código:
<html>
<body>
<p>hola</p>
</body>
</html>
Te devuelve:
Código:
hola

He usado la libreria no estándar asio la cual es parte de boost.
En g++ se puede compilar así(como no es estándar toca linkear):
Código:
g++ http.cpp -lboost_system

Te animo a que completes el código a tu gusto o que por lo menos te sirva un poco de guía.


Título: Re: Código fuente de Lynx
Publicado por: OmarHack en 6 Julio 2013, 02:13 am
Me viene genial! Ahora lo pruebo!
¿Qué tal los exámenes?


Título: Re: Código fuente de Lynx
Publicado por: lapras en 6 Julio 2013, 09:51 am
Bien, todo aprobado ::)


Título: Re: Código fuente de Lynx
Publicado por: 0xDani en 6 Julio 2013, 16:04 pm
@lapras, por curiosidad, por qué pones los parámetros argv y argc al revés de como se suele hacer?  :xD


Título: Re: Código fuente de Lynx
Publicado por: xv0 en 6 Julio 2013, 16:50 pm
@lapras, por curiosidad, por qué pones los parámetros argv y argc al revés de como se suele hacer?  :xD

Solo son nombres no importa lo que pongas, como si quieres ponerle a y b.

Un saludo.


Título: Re: Código fuente de Lynx
Publicado por: lapras en 6 Julio 2013, 17:18 pm
@lapras, por curiosidad, por qué pones los parámetros argv y argc al revés de como se suele hacer?  :xD
Pues por que me equivoqué y luego no tenía ganas de cambiarlo.
Al menos funciona..


Título: Re: Código fuente de Lynx
Publicado por: 0xDani en 6 Julio 2013, 18:50 pm
Solo son nombres no importa lo que pongas, como si quieres ponerle a y b.

Un saludo.

Ya sé que sólo son nombres de variables, pero es cierto que hay una especie de estándar "de facto" en cuanto a los nombres de estas variables, y me llamó la atención que las pusiera al revés, lo cual, de hecho, me causó una pequeña confusión con el código.