Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1046 connectés 

  FORUM HardWare.fr
  Programmation
  C

  serveur web embarqué

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

serveur web embarqué

n°2211616
sebastien_​begue
Posté le 25-11-2013 à 12:40:56  profilanswer
 

Bonjour à tous !  
 
Je suis actuellement en alternance, et mon 1er projet est de pouvoir établir la communication entre mon ordi et un STM32F2 par liaison ethernet.
Les stacks que j'utilise sont faites maison ; j'ai validé ttes les couches jusqu'à TCP en IPv4, mais là je bloque pour la partie HTTP : je voulais d'abord savoir s'il était bien possible de n'utiliser que du HTML et du C pour réaliser ceux-ci ?  
Ensuite, si vous avez des exemples/documents qui traitent de ça s'il vous plait ? Je bloque surtout sur la création de la fonction qui va permettre de transformer une demande de fichier par mon client (navigateur internet) en appel de sous-programme.
 
Merci beaucoup pour votre aide !
 
Dans l'attente de vous lire,
 
 
Cordialement,
Sébastien.

mood
Publicité
Posté le 25-11-2013 à 12:40:56  profilanswer
 

n°2211617
Je@nb
Kindly give dime
Posté le 25-11-2013 à 19:19:24  profilanswer
 

Ce sujet a été déplacé de la catégorie Systèmes & Réseaux Pro vers la categorie Programmation par Je@nb

n°2211623
xilebo
noone
Posté le 25-11-2013 à 20:38:34  profilanswer
 

le protocole HTTP est plus simple que le protocole TCP, je suis étonné que tu rencontres des difficultés sur le protocole HTTP alors que tu n'en as pas rencontré - à priori - sur le TCP.
 
Ensuite, il est effectivement possible d'écrire un (mini) serveur  implémentant le protocole HTTP uniquement en C. Tu cites le HTML mais je pense que c'est une erreur de ta part car cela n'a rien à voir avec le protocole HTTP. le HTML est un langage de présentation généralement transporté dans des requêtes HTTP, mais une requête HTTP peut transporter n'importe quoi d'autre ( XML, texte, binaire ), et le HTML peut s'utiliser en dehors d'un serveur HTTP, par exemple un fichier local qu'on ouvrirait avec un navigateur.
 
Il existe des implémentations de serveur http léger en C desquelles ( ? :o ) tu peux t'inspirer comme par exemple lighttpd ( http://www.lighttpd.net/ )
 
 
Pour commencer, tu peux implémenter la commande la plus simple de la version 1.1 du protocole : GET .

n°2211806
czh
Posté le 27-11-2013 à 00:08:50  profilanswer
 

LE document de travail pour implémenter HTTP : http://tools.ietf.org/html/rfc2616
 

Citation :

Je bloque surtout sur la création de la fonction qui va permettre de transformer une demande de fichier par mon client (navigateur internet) en appel de sous-programme.


 
D'après la RFC 2616: http://tools.ietf.org/html/rfc2616#section-3.7.2
La syntaxe de multipart dans HTTP partage sa syntaxe avec la RFC 2046: http://tools.ietf.org/html/rfc2046#section-5.1.1
 
Exemple de multipart sur le site de w3c : http://www.w3.org/TR/html401/inter [...] -17.13.4.2

n°2211921
tpierron
Posté le 27-11-2013 à 17:54:16  profilanswer
 

Hmm, le multipart HTTP, c'est en général pour faire de l'upload de fichier. Dans son cas, je pense plutôt qu'il veut faire du download.
 
Le download est implémenté en HTTP via une requète de type "GET", relativement triviale à traitée. Typiquement un client écrit un message du genre dans une socket TCP:

Code :
  1. "GET /chemin/du/fichier.txt HTTP/1.0\r\n\r\n"


Suffit ensuite de répondre un truc du genre :

Code :
  1. "HTTP/1.0 200 OK\r\n"
  2. "Content-Type: text/plain; charset=utf-8\r\n"
  3. "Content-Length: %d\r\n\r\n"
  4. /* Contenu du fichier: exactement %d octets devront être écris */


 
Même pas besoin de HTTP 1.1 pour ça. Si tout ce que doit faire ton serveur HTTP c'est d'envoyer des fichiers, c'est à peu près le seul type de requète que tu auras à traiter. Le reste tu peux envoyer une réponse type "HTTP/1.0 400 Bad request"
 
Cela dit, je pense que tu devras au moins traiter des requètes avec un Content-Type valant "application/x-www-form-urlencoded" (typiquement le type de requète envoyée suite à la validation d'un formulaire HTML). Ce n'est pas beaucoup plus compliqué qu'une requète de type "GET", même s'il y a quelques pièges à faire attention.
 
Si tu veux partir d'une base existante, j'ai déjà jouer avec ça :

  • Apache: l'artillerie lourde. Très complet, supporte tout ce qui possible en HTTP (1.0, 1.1, SSL, WebSocket, ...). Vaut mieux avoir un système d'exploitation relativement complet (type Unix ou Windows) si tu veux utiliser cette base de code. Si tu vire la partie SSL et la plupart des modules, ça ne prends pas tant de place que ça (1Mo environ). Son intégration sous Windows est vraiment bien faite (comparé à lighttpd, probablement nginx aussi).
  • Lighttpd : la base de code est un peu moins lourde qu'apache, mais ça reste assez conséquent. Si tu n'as pas de système Unix (gestion de process via fork ou pthread, communication inter process, signaux, descripteur de fichiers, ...) sur ton architecture, tu peux oublier.
  • Libmicrohttpd : une dll sous license LGPL. Si tu vires le support SSL, la DLL est minuscule, donc attends toi à du bas niveau. Pour le peu que j'ai utilisé cette lib, je l'ai trouvé lourdingue pour le peu de travail qu'elle effectue. Je n'ai pas trop regardé le code, mais il me semble qu'il y a juste une dépendance avec l'API des sockets BSD (et OpenSSL en option).
  • tinyhttpd : un code source de 15Ko, qui montre comment traiter des requètes GET, POST, ainsi que la gestion des CGI. Utilise l'API des sockets BSD, pthread pour la gestion des requètes de manière concurente, et fork() pour les CGI (le tout étant assez trivial à changer).


 
 

n°2211926
xilebo
noone
Posté le 27-11-2013 à 18:59:59  profilanswer
 

Merci pour ces précisions, ca pourra me servir  :jap:

n°2212345
sebastien_​begue
Posté le 02-12-2013 à 09:55:53  profilanswer
 

Bonjour !  
 
Désolé du retard.
Merci pour toutes vos réponses : en ce moment c'est mon parsage qui ne fonctionne pas bien, car mon serveur web embarqué n'arrive pas à traiter le GET qui lui arrive.
Aussi, j'ai un problème quand j'essaie d'utiliser telnet en cmd, quand je tape "telnet IP PORT", ça me met transforme ma cmd en écran noir(je passe pas par l'étape où il m'affiche "connected to IP" ), et quand je tape quelque chose ça me met des "_" pour chaque lettre que je tape mais ça ne me répond rien... une idée s'il vous plait ?  
 
Aussi, je voulais tester le mode client de mon embarqué, mais je ne sais pas si cela est possible s'il vous plait ? ( c'est à dire l'embarqué qui émet une requete genre pour récupérer un fichier html sur mon ordi ).
 
 
Cdt,
 
Sébastien.

n°2212526
tpierron
Posté le 03-12-2013 à 22:27:28  profilanswer
 

Si tu veux tester ton serveur web embarqué, je te conseillerais plutôt d'utiliser netcat. Il n'est pas dispo sur windows par défaut, mais dispo sur quasi tous les autres systèmes. C'est un peu le couteau suisse des connexions réseaux. Par exemple pour tester ton serveur web:

Code :
  1. $ nc serveur-web 80
  2. GET / HTTP/1.0
  3.  


 
À la suite de ça, si ton serveur web n'est pas trop mal foutu, tu devrais avoir le contenu de la racine du site web. Tu peux aussi stocker ça dans un fichier, genre :

Code :
  1. $ echo -e "GET / HTTP/1.0\r\n\r\n" > http.txt
  2. $ cat http.txt | nc serveur-web 80


n°2212538
sebastien_​begue
Posté le 04-12-2013 à 02:22:50  profilanswer
 

Salut !
 
Je vois ce que tu veux dire tpierron, merci !
 
J'aurais quelques autres questions : le mode serveur commence à bien fonctionner, c'est à dire que mon navigateur envoie des GET à mon serveur web embarqué, et j'arrive à afficher des pages html simple (avec du texte à l'intérieur tout simplement).
Cependant j'aimerai maintenant allumer par exemple mes LEDs via un bouton que je commande au niveau de ma page html : je ne vois pas trop comment interagir avec le materiel quand par exemple on appuie sur un bouton, alors pouvez-vous m'aider là-dessus s'il vous plait ? ( j'avais pensé passer par des "a:active" (mais mes démarches n'allaient pas plus loin), ensuite on m'a orienté vers javascript, même ajax car je ne vais pas pouvoir gérer ça en statique ).
 
Merci de votre aide !
 
Cdt,
Sébastien.

n°2212544
xilebo
noone
Posté le 04-12-2013 à 07:38:50  profilanswer
 

sous windows on peut utiliser putty en mode raw.
 
 
Pour interagir avec ton système, il suffit que tu transmettes l'information depuis ton client vers ton serveur.
 
Cela peut être par exemple une première page générée par ton serveur contenant les actions possibles à faire , que tu récupères avec ton client sous la forme d'un GET.
 
Ensuite, cette page générée doit te permettre d'envoyer des nouvelles commandes à ton serveur afin d'interagir avec ton serveur. Soit par d'autres commandes GET ( dans lesquelles tu es en mesure de passer des paramètres ), soit par la commande POST ( qui est une autre commande du protocole HTTP ). Ton serveur recoit ensuite la nouvelle commande ( GET ou POST ) dans laquelle tu as mis des paramètres, tu es en mesure de récupérer ces paramètres coté serveur, et en fonction du paramètre, agir sur ton matériel coté serveur ( vu que tu es maitre du code, ca ne devrait poser aucun problème, ca aurait été plus compliqué si tu devais passer par un serveur existant ).


Message édité par xilebo le 04-12-2013 à 07:42:40
mood
Publicité
Posté le 04-12-2013 à 07:38:50  profilanswer
 

n°2212566
rufo
Pas me confondre avec Lycos!
Posté le 04-12-2013 à 11:06:16  profilanswer
 

Il risque d'avoir besoin d'un langage côté serveur genre PHP s'il veut interagir avec le matériel. Là, ça risque de se compliquer car son serveur web va devoir être capable de gérer l'interpréteur php :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2212576
dreameddea​th
Posté le 04-12-2013 à 12:08:30  profilanswer
 

Non pour moi la Logique REST est plus que suffisante, des messages du type :

Code :
  1. GET url/led/1
  2. UPDATE url/led/state/1 //Permet d'allumer la led


 
Et un petit parsing de l'url peut largement suffire
 
Après je ne connais pas la spécif totale des UPDATE/POST, mais si on oublie les complexités inutiles (fichiers, etc...) je ne pense pas que ça soit trop compliqué
 
Cdlt
 

n°2212584
rufo
Pas me confondre avec Lycos!
Posté le 04-12-2013 à 13:24:34  profilanswer
 

Effectivement, du REST + un bout de code en C/C++ pourrait suffire si les données à transmettre sont aussi simples.
 
Edit : tu parles de requête UPDATE, mais ça serait pas plutôt PUT ? J'ai pas trouvé de commande UPDATE sur Wikipedia : http://fr.wikipedia.org/wiki/Http


Message édité par rufo le 04-12-2013 à 13:28:11

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2212594
dreameddea​th
Posté le 04-12-2013 à 15:26:45  profilanswer
 

pardon, effectivement c'est PUT/POST  
 
J'aurai du m’arrêter à la première ligne au lieu d'écrire des c.... sans vérifier
 
Désolé

n°2212675
sebastien_​begue
Posté le 05-12-2013 à 16:32:50  profilanswer
 

Bonjour !  
 
Merci pour tous tous vos conseils/idées !
Je suis parti que sur des GET histoire d'avoir quelque chose de plutôt simple, avec un parsage à chaque fois que je veux allumer/eteindre une LED (genre je passe de "http://IP/ledOn" à "http://IP/ledOff", vu que je n'ai pas encore bien appréhendé tous les concepts de "?", "&", etc... d'ailleurs auriez-vous des documents/liens qui traiteraient de ceux-ci de manière précise s'il vous plait ?
 
Aussi, et surtout, je n'arrive pas à voir comment gérer des requêtes en parallèles côté serveur, donc si vous pouviez m'éclairer un peu là-dessus s'il vous plait ?
 
 
Bien cordialement,
Sébastien.

n°2212677
rufo
Pas me confondre avec Lycos!
Posté le 05-12-2013 à 16:58:31  profilanswer
 

Ben ? se met à la fin de l'url et annonce des paramètres.
& se trouve dans ce qui suit le ? et sert de délimiteur entre les paramètres passé en GET.
Ex : http:/www.monsite.com/Rep1/MaPage.php?Pa [...] =Value2...
 
Y'a aussi le # qui peut se trouve à la fin d'une url : c'est pour indiqué une ancre dans une page html.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2212679
tpierron
Posté le 05-12-2013 à 17:12:54  profilanswer
 

sebastien_begue a écrit :

Aussi, et surtout, je n'arrive pas à voir comment gérer des requêtes en parallèles côté serveur, donc si vous pouviez m'éclairer un peu là-dessus s'il vous plait ?


 
Là, ça va dépendre de l'API auquelle tu as accès sur ton architecture embarquée. Si tu as un système Unix sous la main, l'approche classique est de démarrer un nouveau thread (via l'API pthread, donc), lorsque la fonction accept() retourne une connexion valide (>0). C'est tellement classique comme technique, que tout serveur acceptant des connexions TCP, utilise en général ce genre d'approche (pas juste HTTP).
 
Maintenant, si tu n'as pas de système d'exploitation sur ton archi, autant te dire que ça va être la merde, et va falloir être prêt à aligner les tartines de codes pour concevoir un embryon de système multi-tâche.
 
Cela dit, si tes requètes ne prennent pas trop de temps, ça ne devrait pas être si handicapant que ça de ne traiter qu'un seule requète à la fois.

n°2212792
sebastien_​begue
Posté le 06-12-2013 à 15:19:42  profilanswer
 

Bonjour à tous !
 
Je n'ai pas de systèmes d'exploitation sur mon embarqué, mais je ne pars plus sur un multitache (trop loin pour coder), mais plutot sur le fait de laisser en buffer les connexions entrantes en attendant que celle qui est en cours finisse.
 
Aussi, je suis en train d'implémenter un gestionnaire de fichiers (pour la récupération de ceux-ci dans un dossier présent sur l'automate (de mon environnement de travail quoi)) -> j'ai bien les structures associées, mais je n'arrive pas à aller récupérer les fichiers via une fonction C... une idée peut etre ?
 
Cordialement,
Sébastien.

n°2212801
rufo
Pas me confondre avec Lycos!
Posté le 06-12-2013 à 15:57:54  profilanswer
 

Les fonctions C concernant les fichiers sont POSIX. Donc, à moins de te cogner le codage de cette "norme", va falloir coder très bas niveau, je pense, genre, te créer ton petit filesystem à toi... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  serveur web embarqué

 

Sujets relatifs
serveur et client réseau sur même machine[SQL] Répliquer/Synchroniser BDD sur serveur distant
Mon serveur Nas veut pas récupérer le contenu du dossier à distance ?Serveur Minecraft
mini serveur en C: setsockopt() == -1Blocage de mon Serveur de tchat (AcceptTcpClient)
Connection à un serveurCréer un mini serveur local
Propriété data, envoi du paramètre au serveursite en HTML pour serveur web embarqué
Plus de sujets relatifs à : serveur web embarqué


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR