Blogia
Geeks i d'altres

Server Web

Fa uns dies un company me va comentar que tenia com a projecte de programació d'aquest estiu programar un server web mitjanament decent, que servís pàgines webs amb html. Li vaig dir que me pareixia una bona idea, i que d'aqui unes setmanes m'hos hi podriem posar.
Me vaig anar informant, i vaig començar a lletgir es RFC 2616, i he fet un server de sockets TCP que escolta al port 80, lletgeix la pagina que demana el navegador (de l'HTTP Request) i envia un HTTP Response amb el codi de la pagina.

El codi font és a http://servomac.funpic.org/code/web_server.c, i està llicenciat sota GPL.
Ara per ara és una porqueria. Només accepta una petició HTTP, contesta i surt del bucle. El meu objectiu principal es que sigi capaç de servir pagines fins que el root acabi l'execució.

Per una altra banda, l'HTTP Response és molt pobre i s'hauria de millorar. A més, dona per suposat que la versió del protocol és la 1.1, i moltes altres coses que són 100% anti-robustesa. Com deia en Guillem als comentaris del tema anterior, he de donar gracies a que el navegador toleri tants d'errors :P.
Si teniu un moment, m'encantaria que mirasiu el codi i hem fesiu tots els comentaris posibles per a millorar el codi i el programa en general. S'agrairia molt, ja que això no és més que una versió alpha :D.

Salut!

ACTUALITZACIÓ : Acab d'afegir posibilitat de respondre a més d'una petició cada execució del programa, mitjançant un bucle infinit i procesos fills. He creat un CHANGELOG (que podeu trobar a "http://servomac.funpic.org/code/CHANGELOG.txt") on faig comptes anar publicant els canvis en el codi. La nova versió del server, amb concurrència, està publicada a "http://servomac.funpic.org/code/serverCon.c". Encara no tenc gens de maña amb el tema de jerarquia de procesos i tal, i no tenc ni idea de si estic fent una "xapusa". Ja em donareu la vostra opinió!

ACTUALITZACIÓ 2 : Ara ja mat els procesos zombies amb waitpid, perque no molestin a la taula de procesos.

4 comentarios

servomac -

Moltes gracies pels comentaris al·lots! Que faria sense voltros? xD
Si fer un procès fill per a cada petició és exagerat, te faré cas i me miraré el tema d'els threads. Ja que hi sóc, aprofit per demanar-te si saps d'algun bon paper, o un llibre que pugi trobar a la biblioteca de l'Anselm Turmeda :P, per lletgir una mica de teoria i tal, perque que jo tengi record domés he lletgit una vegada sobre threads, i era a un dels llibres d'en Tannembaum sobre SOs.
Ara per ara intentaré que la implementació del protocol HTTP sigi una mica més "sèria", i acceptar POSTs i demés en lloc de tan sols GETs :P.
Salut i gracies de nou!

guillem -

Perdona el comentari doble però som al cul del món, m'he de connectar via modem, això va tremendament lent, i he fet dos o tres clicks en lloc d'un O:-P

guillem -

Molt cert, la concurrència és important. I pensa que fer un procés per a cada client és exagerat i contraproduent quan la cosa ha de funcionar de veres, perquè de vegades fer el procés costa més que servir la resposta. Jo me miraria com van els processos lleugers, o fils, o threads, o com s'hagin de dir, ja m'entens. O si no, l'entrada sortida sincrona pseudo-concurrent multiplexada amb select() ha estat sempre un exercici molt interessant a l'hora de programar servidors, en molts de casos funciona, i no requereix ni tan sols soport de concurrència per part del sistema operatiu ;-)

Guti -

Cuidado con la concurrencia.
Va bien pensarlo al principio del desarrollo, al final tendrá que se multiproceso, por lo que mejor tenerlo en cuenta.