Serveur html en soket TCP [Résolu] - C - Programmation
Marsh Posté le 04-02-2008 à 21:07:35
En gros tu dois faire un mini-server web multi-threadé ? Si le C t'es imposé, regarde du coté de FastCGI + lighttpd ou Apache.
Marsh Posté le 04-02-2008 à 21:09:47
Oui en gros c'est ça un mini serveur multi - threadé qui envoie du code sur un client web. Et le C est imposé ainsi que cette structure même si elle n'est pas très claire...
Merci de la réponse rapide
EDIT
Après avoir cherché je ne trouve pas de code sur lequel m'inspirer...
Marsh Posté le 04-02-2008 à 21:23:20
Ce n'est pas vraiment de l'inspiration qu'il faut chercher, mais plutôt de la réutilisation. Recoder ces technos, tu en as pour 2 ans avant d'avoir un truc stable.
Marsh Posté le 04-02-2008 à 21:26:55
Ce n'est pas à moi qu'il faut le dire mais à ces gens dans les bureaux qui font les programmes scolaires...
Si ça ne tenait qu'a moi je leur enverrais un apache déja compilé !
Mais là il faut que je code ce générateur c'est bien pour ça que je fais appel aux compétences de ce forum... c'est assez habérant de recoder la roue mais c'est comme ça si je ne le fait pas je peux dire adieu a mes études ^^
Toute aide est la bienvenue lorsqu'on est dans cette situation !
Marsh Posté le 05-02-2008 à 15:43:04
yad40 a écrit : Voila mon problème : je dois générer un affichage html pour un client web (firefox/ie) à partir d'un programme en C qui utilise du socket TCP, de plus cela doit être threadé. |
Ce code ne compile absolument pas. (read() et write() ne s'utilisent pas du tout comme ça...)
Voici une version compilable sous Windows et Linux :
Code :
|
Il faut fournir un contexte individuel à chaque thread.
Il ne faut pas fermer le socket client tout de suite après avoir lancé le thread... En fait, tu as prévu une fermeture dans le thread après 60s. C'est un peu gore comme méthode, mais ça permet de démarrer. J'en profite pour libérer le contexte.
Voici ce que je reçois sur le telnet :
<HEAD></HEAD> |
et voici ce qu'affiche le serveur au bout d'une minute :
Fin du thread |
Attention, je ne connais pas bien le protocole HTTP, mais il semble qu'il ne soit pas respecté, notamment les fins de lignes etc.
Marsh Posté le 05-02-2008 à 19:28:05
Merci cela me sera bcp utile !
J'ai fait ça durant la journée ça :
Code :
|
Le professeur veut qu'en plus le chemin absolu de l'endroit où sont les fichiers .html et le numéro de port soient dans un fichier.conf.
Que les logs de ce qui se passe soient répertoiré dans un fichier dont le nom est paramétrable dans le .conf.
Que les variables globales soient protégées.
Actuellement la partie affichage marche sans problèmes par contre si je tape http://localhost:port/un-dossier-o [...] existe-pas j'ai une erreur de segmentation et pas moyen de trouver une fonction si fichier/dossier existe !
A l'heure où j'écris ce post, je n'ai pas encore regardé le code de Emmanuel Delahaye de près je le fait sur l'heure !
Marsh Posté le 06-02-2008 à 13:20:28
Si le fichier n'existe pas, open va renvoyer -1 et positionner errno à ENOENT. Attention car tu as aussi des cas similaires qui renverront d'autres errno, par exemple ENTDIR si le un des éléments du path du fichier n'est pas un répertoire (c'est par exemple un fichier normal).
Tu peux aussi faire un stat() pour tester l'existence du fichier sans l'ouvrir.
Marsh Posté le 13-02-2008 à 21:20:07
Bonsoir, après avoir passé pas mal de temps sur mon bout de code j'en suis là :
Code :
|
J'ai encore quelques petites choses a gérer :
1) Une erreur quand on tape une url non valide (un fichier qui n'existe pas) : erreur dans le write() de :
Code :
|
et je ne vois pas où elle est...
2) Tuer proprement le/les processus avec ctrl+c
3) Gérer la libération du port lorsque le serveur est en erreur et arrive sur un exit();
4) Recharger le fichier de configuration à la reception du signal SIGUP (ceci est uine énigme pour moi...)
5) Rajouter pour chaque perror et printf de "ce que fait le serveur", l'ip de l'utilisateur et l'heure
6) Rediriger les perror et printf de "ce que fait le serveur" dans le fichier de log
Voila je merci d'avance pour toute aide !
Marsh Posté le 14-02-2008 à 09:28:29
1) C'est quoi ce write à 6 arguments ?
2) man sigaction
4) C'est SIGHUP avec un H
6) Tu peux regarder du côté de dup2 pour rediriger STDERR vers le fichier
Marsh Posté le 14-02-2008 à 11:10:23
merci je vais voir ça !
EDIT : En effet le write() était bien le problème
Je vois le reste demain dans le journée
Marsh Posté le 19-02-2008 à 09:39:44
Bon merci à tous pour votre aide, j'arrive à la fin de mon programme !
Je voudrais savoir ce que vous en pensez, ce que vous rajouteriez, si il y a des choses qui vous paraissent incorrectes etc...
Code :
|
Note : Il y a maintenant un fichier de configuration :
Citation : # http.conf |
Note :
J'ai laissé tombé le nettoyage propre avec SIGINT
J'ai remplacé le SIGHUP par SIGTERM pour pouvoir tester beaucoup plus facilement
Il me reste juste à gérer que tous les affichages écrans s'affichent à la fois sur l'écran mais aussi dans le fichier de log, j'ai regardé la fonction dup2 (man dup2 + internet mais je ne l'ai pas bien comprise - par contre sigaction sans aucuns problèmes -)
Un dernier petit coup de pouce svp !
Merci encore !
Marsh Posté le 19-02-2008 à 12:47:35
Ah non tu ne peux pas afficher à la fois sur l'écran et dans un fichier avec dup2. La seule solution c'est de te faire un fonction qui fait les deux printf.
Avec dup2 ce que tu peux faire c'est faire en sorte que STDERR (ou STDOU) pointe vers un fichier. Les affichages se font alors dans le fichier au lieu de se faire à l'écran.
Marsh Posté le 19-02-2008 à 14:27:19
Pour l'affichage écran pas de problèmes, le printf je connais bien par contre comment écrire dans un fichier très simplement ? sans passer par une écriture caractère par caractère ?
Marsh Posté le 19-02-2008 à 16:11:51
Et bien c'est pareil, tu ouvres un fichier avec fopen puis tu passes le FILE * à fprintf.
Marsh Posté le 25-02-2008 à 21:20:56
Merci tout marche impecablement maintenant merci à tous !
Marsh Posté le 04-02-2008 à 20:57:07
Voila mon problème : je dois générer un affichage html pour un client web (firefox/ie) à partir d'un programme en C qui utilise du socket TCP, de plus cela doit être threadé.
Voici où j'en suis :
En plus si je fais un get en telnet je dois voir l'entete http suivante : "GET / HTTP/1.1\nHost: localhost:2083\nUser-Agent:
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041111
Firefox/1.0\nAccept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\nAccept-Language:
en-us,en;q=0.5\nAccept-Encoding: gzip,deflate\nAccept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.7\nKeep-Alive: 300\nConnection:
keep-alive\nCache-Control: max-age=0\n"
le port utilisé doit etre 12345 de façon à avoir l'affichage suivant qui est généré : "<HTML>\n\t<HEAD></HEAD>\n\t<TITLE>Ma page</TITLE>\n\t<BODY>Mon
contenu</BODY>\n</HTML>\n"
Voila j'espere que vous pourrez me donner un coup de main !
PS : de plus il y a un problème de cache, au bout d'un moment les threadent posent problèmes... ceci est un exo noté donc toute aide est la bienvenue !
Message édité par yad40 le 25-02-2008 à 21:21:19