Código fuente de Lynx

Iniciado por OmarHack, 26 Mayo 2013, 13:56 PM

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

lapras

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.

OmarHack

Gracias de nuevo me has echo medio trabajo! Si te puedo ayudar en algo no dudes en pedírmelo  :silbar:
I like to test things.

lapras

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

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

OmarHack

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!!
I like to test things.

lapras

He acabado los examenes.
Aquí esta el código:

Código (cpp) [Seleccionar]
/*Text based web browser*/

#include <string>
#include <iostream>
#include <boost/asio.hpp>

using namespace std;

string get_formated_web(string);
string getWeb(string);
string getPage(string);

int main(int argv, char **argc){

if(argv==2){
string web=getWeb(string(argc[1]));
cout<<"web: "<<web<<endl;
string page=getPage(string(argc[1]));
cout<<"page: "<<page<<endl;

boost::asio::ip::tcp::iostream stream;
stream.expires_from_now(boost::posix_time::seconds(60));
stream.connect(web, "http");
stream << "GET "<<page<<" HTTP/1.0\r\n";
stream << "Host: "<< web <<"\r\n";
stream << "Accept: */*\r\n";
stream << "Connection: close\r\n\r\n";
stream.flush();

stringstream codestream;
codestream<<stream.rdbuf();
string htmlsource( codestream.str() );

string formatedweb=get_formated_web(htmlsource);
std::cout << formatedweb;
}
else{
cout<<"Wrong arguments."<<endl
<<"Usage: http www.webpage.com"<<endl;
}
}


/* given: www.webpage.com/page.html */
/* returns: www.webpage.com */
string getWeb(string a){
string web;
for(int i=0;i<a.size();i++){
if(a[i]==':'){
web+=a[i];
if(i+2<a.size()){
if(a[i+1]=='/' && a[i+2]=='/'){
web+="//";
i+=2;
}
}
}
else if(a[i]=='/'){
return web;
}
else{
web+=a[i];
}
}
return web;
}

/* given: www.webpage.com/page.html */
/* returns: /page.html */
string getPage(string a){
string page;
bool found=false;
for(int i=0;i<a.size();i++){
if(found){
page+=a[i];
}
else{
if(a[i]==':'){
if(i+2<a.size()){
if(a[i+1]=='/' && a[i+2]=='/') i+=2;
}
}
else if(a[i]=='/'){
page+='/';
found=true;
}
else{}
}
}

if(page=="") return "/";
return page;
}


/* given: html source code */
/* returns: formatted text webpage */
string get_formated_web(string unformated){
return unformated;
}


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:
<html>
<body>
<p>hola</p>
</body>
</html>

Te devuelve:
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):
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.

OmarHack

Me viene genial! Ahora lo pruebo!
¿Qué tal los exámenes?
I like to test things.

lapras


0xDani

@lapras, por curiosidad, por qué pones los parámetros argv y argc al revés de como se suele hacer?  :xD
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

cpu2

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

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

Un saludo.

lapras

Cita de: 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
Pues por que me equivoqué y luego no tenía ganas de cambiarlo.
Al menos funciona..