IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Faire du CGI en C


Sujet :

C

  1. #1
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut Faire du CGI en C
    Bonjour, les gars.
    J'aimerais faire du CGI en C. J'ai écrit un code tout simple et ca marche pas. Mon serveur me renvoie un 500 Internal Server Error. Pouvez m'aider svp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <X11/Xutil.h>
    #include <X11/Xresource.h>
    #include <X11/Xlib.h>
     
    Display *dpy;
     
    int main(int argc, char *argv[]){
     char *qs;
     
     if (! (dpy = XOpenDisplay(":0.0"))) {
        fprintf(stderr, "%s: dispositif %s injoignable\n", argv[0],
                  XDisplayName(NULL));
        return -1;
      }
      qs = getenv("QUERY_STRING");
      fprintf(stdout,"Content-type: text/html\n\n");
      fprintf(stdout,"<html><head></head><body><p>");
      fprintf(stdout,"Query_String : %s\n",qs);
      fprintf(stdout,"</p></body></html>\n");
     
     
     return 0;
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    J'ai du mal à voir ce que X11 vient faire dans du CGI Web...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Et avec un code plus simple ? Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h>
    int main(void)
    {
        printf("Hello world\n"); 
        return 0;
    }
    Sinon, avant de se servir de qs, il faut vérifier que c'est valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      qs = getenv("QUERY_STRING");
      fprintf(stdout,"Content-type: text/html\n\n");
      fprintf(stdout,"<html><head></head><body><p>");
      if(NULL != qs) {
        fprintf(stdout,"Query_String : %s\n",qs);
      } else {
        fprintf(stdout,"INVALID Query_String\n");
      }
    Citation Envoyé par Médinoc Voir le message
    J'ai du mal à voir ce que X11 vient faire dans du CGI Web...
    Déjà vu : ça peut se justifier si le serveur et le client sont sur la même machine, mais c'est tordu.

  4. #4
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    J'ai du mal à voir ce que X11 vient faire dans du CGI Web...
    Salut Médinoc, et merci pour ta réponse . Ce bout de code fait partie d'un jeu que je développe dans le cadre d'un projet à la fac en X11. Dans ce projet, j'aurai à faire à recevoir des requetes HTTP dans ma QUERY_STRING et que je vais envoyer à travers des propriétes (atom) à la fenetre principale de mon jeu.
    Can somebody help me plz !

  5. #5
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,
    Déjà vu : ça peut se justifier si le serveur et le client sont sur la même machine, mais c'est tordu.
    Oui le serveur et le client sont sur la meme machine.

    J'ai essayé ton exemple mais ca ne marche pas.

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par publicStaticVoidMain Voir le message
    J'ai essayé ton exemple mais ca ne marche pas.
    Je suppose que l'exemple fonctionne lorsqu'il est lancé seul.

    Si cela ne fonctionne pas, ce doit être que le serveur http n'arrive pas à lancer le CGI... Est il configuré pour ça ? quel Code html lance le CGI ?

  7. #7
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Je viens de consulter mes logs d'Apache et ca m'affiche ca comme erreur (apres plusieurs exécutions)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    /usr/lib/cgi-bin/relais_lignes.cgi: dispositif  injoignable
    [Thu May 14 16:42:06 2009] [error] [client 127.0.0.1] Premature end of script headers: relais_lignes.cgi
    No protocol specified
    /usr/lib/cgi-bin/relais_lignes.cgi: dispositif  injoignable
    [Thu May 14 16:42:06 2009] [error] [client 127.0.0.1] Premature end of script headers: relais_lignes.cgi
    No protocol specified
    /usr/lib/cgi-bin/relais_lignes.cgi: dispositif  injoignable
    [Thu May 14 16:42:07 2009] [error] [client 127.0.0.1] Premature end of script headers: relais_lignes.cgi
    No protocol specified
    /usr/lib/cgi-bin/relais_lignes.cgi: dispositif  injoignable
    [Thu May 14 16:44:21 2009] [error] [client 127.0.0.1] Premature end of script headers: relais_lignes.cgi
    No protocol specified
    /usr/lib/cgi-bin/relais_lignes.cgi: dispositif  injoignable
    [Thu May 14 16:44:22 2009] [error] [client 127.0.0.1] Premature end of script headers: relais_lignes.cgi
    Quelqu'un aurait-il une idée?

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Hum, ton programme s'appelle bien relais_lignes.cgi et est bien situé dans /usr/lib/cgi-bin/ ?

    Sinon, l'extension cgi d'apache est-elle activée ?

    Quel est le code html pour lancer le cgi ?

  9. #9
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par mabu Voir le message
    Hum, ton programme s'appelle bien relais_lignes.cgi et est bien situé dans /usr/lib/cgi-bin/ ?

    Sinon, l'extension cgi d'apache est-elle activée ?

    Quel est le code html pour lancer le cgi ?
    Oui l'extension cgi est bine activée et est bien située dans /usr/lib/cgi-bin.
    J'ai un tout petit peu progressé parce que ca m'affiche maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [Thu May 14 17:32:35 2009] [error] [client 127.0.0.1] Premature end of script headers: relais_lignes.cgi
    En fait, je reçois une requete du type :

    http://localhost/cgi-bin/relais_lign...=5&couleur=red.

    Et je dois récupére la valeur 5 et la couleur red. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <X11/Xutil.h>
    #include <X11/Xresource.h>
    #include <X11/Xlib.h>
     
    Display *dpy;
     
    int main(int argc, char *argv[]){
     //char *qs;
      int nombre_de_lignes;
      char * couleur;
      char * sender;
      char *qs = getenv("QUERY_STRING"); 
      qs = index(qs, '/') + 1;
      sender = qs;
      qs = index (qs,'=');
      nombre_de_lignes = atoi(qs + 1);
     
      qs += 2;
      qs = index (qs,'=');
      couleur = qs +1; 
      fprintf(stdout,"Content-type: text/html\n\n");
     
      fprintf(stdout, "<html><head></head><body>");
      fprintf(stdout,"<p>Nombre de lignes = %d </p>", nombre_de_lignes); 
      fprintf(stdout,"<p>Couleur = %s </p>", couleur);
      fprintf(stdout,"</body></html>");  
      return 0;
    }

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Pour avoir fait beaucoup de CGI en C et C++, je dirais que

    → « 500 Internal Error » est très souvent due à un « Premature End Of Script Header », ce qui signifie « Fin prématurée des entêtes du script » ;
    → Tu vois ces erreurs dans ton log que tu vois dans ton log ;
    → Ça veut dire que le script n'envoie pas les entêtes HTML de rigueur (ou pas entièrement) ;
    → Ce qui signifie en général que le programme se termine avant ;
    → Ce qui est dû neuf fois sur dix à une segfault (auquel le programme reste muet, par définition) ;
    → Ce qui peut également être dû à autre chose :

    /usr/lib/cgi-bin/relais_lignes.cgi: dispositif injoignable
    [Thu May 14 16:44:21 2009] [error] [client 127.0.0.1] Premature end of script headers: relais_lignes.cgi
    No protocol specified
    Où trouve-t-on le message « dispositif injoignable » ?

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if (! (dpy = XOpenDisplay(":0.0"))) {
        fprintf(stderr, "%s: dispositif %s injoignable\n", argv[0],
                  XDisplayName(NULL));
        return -1;
      }

    Au même endroit qu'un « return -1 » !

    Donc, ton CGI essaie de se connecter à ton serveur X pendant la durée de ta requête, ce qui n'est déjà pas terrible. Comme il n'y arrive pas, il ressort avec -1 avant d'envoyer le minimum syndical en matière d'entêtes HTTP, et le serveur se plaint.

    Conseil du jour : les globales, c'est mal :


  11. #11
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par Obsidian Voir le message

    Conseil du jour : les globales, c'est mal :

    MErci Obsidian pour ta remarque, si tu regardes bien ,j'ai changé mon code et j'ai une nouvelle erreur.

  12. #12
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Quelqu'un pourrait -il m'aider svp? Ca fait un bout de temps que je bloque !!

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par publicStaticVoidMain Voir le message
    MErci Obsidian pour ta remarque, si tu regardes bien ,j'ai changé mon code
    La dernière version de ton code que je vois se trouve au post #9 et je vois toujours une variable globale. M'enfin bon, ce n'est pas très grave.

    et j'ai une nouvelle erreur.
    Citation Envoyé par publicStaticVoidMain Voir le message
    Quelqu'un pourrait -il m'aider svp? Ca fait un bout de temps que je bloque !!
    Patience !

    Si tu ne nous dis pas quelle est cette nouvelle erreur, comment veux-tu qu'on le devine ? Ton programme est déjà un extrait d'une partie plus large, et est censée être appelée par un serveur web. C'est déjà bien qu'on ait pu l'analyser à l'œil nu depuis le forum ...

    Update après relecture

    Ce n'est pas une nouvelle erreur, tu vois déjà ce message dans ton post précédent et je t'ai déjà donné la réponse. En l'occurence, je suis presque sûr que c'est ton QUERY_STRING qui met le souk :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    char *qs = getenv("QUERY_STRING");

    Donc, si QUERY_STRING n'est pas définie, « qs » est forcément NULL, et tu ne le vérifie pas. Bon ok, en C.G.I., elle doit l'être.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    qs = index(qs, '/') + 1;

    QUERY_STRING contient uniquement ce qui se trouve après le « ? », chose que tu aurais déjà dû vérifier. En l'occurence, comme index() ne trouvera jamais ton slash, elle renverra toujours NULL. Et comme tu ajoutes 1, ton pointeur vaut 0x00000001. Il pointe donc d'ores et déjà sur un endroit invalide et il n'y plus aucun moyen pour les fonctions suivantes de s'en rendre compte. Segfaut garantie.

    Essaie de lancer ton programme depuis la ligne de commande directement, pour voir comment il se comporte.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      sender = qs;
      qs = index (qs,'=');
      nombre_de_lignes = atoi(qs + 1);

    Attention : « sender » va pointer le nom de l'argument passé dans la requête, mais également tout le reste. Il ne s'arrêtera pas à « = » si tu ne remplaces pas celui-ci par un « \0 », ou que tu fais un autre contrôle par toi-même.

    D'autre part, tout ceci ne fonctionnera que si ta requête est parfaitement formée. Il suffira à un de tes clients d'appeler ton CGI avec quelque chose d'autre pour le faire planter à distance.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(stdout,"Content-type: text/html\n\n");

    Un T majuscule à Type.


    Bon courage.

  14. #14
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Salut et merci Obsidian pour tes conseils. Je les ai suivis à la lettre. En effet ma QUERY_STRING était nulle, c'est ce qui provoquait cette erreur au serveur.

    Encore une fois merci et bon courage.

    Résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire un CGI en VBS
    Par ner0lph dans le forum VBScript
    Réponses: 6
    Dernier message: 18/06/2010, 22h03
  2. Faire des CGI Delphi, encore d'actualité ?
    Par tipiweb dans le forum Web & réseau
    Réponses: 0
    Dernier message: 22/11/2008, 19h41
  3. Réponses: 1
    Dernier message: 13/05/2006, 10h24
  4. [EasyPHP] Faire tourner des scripts PHP en cgi
    Par Jim_Nastiq dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 19/04/2006, 10h45
  5. [cgi/DOM] Faire d'abord du DOM puis du cgi
    Par chpog dans le forum Web
    Réponses: 2
    Dernier message: 11/07/2005, 17h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo