CGI est la norme d'interface utilisée pour connecter un programme externe pour la communication avec le serveur. Le programme qui fonctionne en fonction d'une telle interface avec le serveur Web est communément appelé une passerelle, bien que beaucoup préfèrent les noms «script» ou «programme CGI». En fait, il permet d'utiliser la console d'entrée et de sortie pour interagir avec le client.
L'interface elle-même est conçue de telle manière que tout langage de programmation peut être utilisé qui peut fonctionner avec des appareils standard-entrée-sortie. Les scripts pour les interprètes de commandement construits des systèmes d'exploitation ont de telles opportunités, donc dans des cas simples, même les scripts de commande peuvent être utilisés.
CGI est l'un des moyens les plus courants de créer des sites dynamiques. Cette norme est utilisée par des serveurs Web aussi populaires tels que par exemple Nginx ou Apache.
Le serveur sait le réparer sur un hôte spécifique: le port et écouter les connexions entrantes. À une adresse donnée, une page HTML est émise si la demande est correcte, ou une page avec une erreur de 404, si la page demandée n'existe pas. Un script CGI affichant l'heure lors de l'appui des boutons de la page principale est également implémenté.
#!
htdocs/
cgi-bin/
install.c
utility.c
utility.h
main.c
Makefile
Nous l'installons en utilisant la marque. Le script d'installation compile et déplacera le fichier exécutable dans le dossier / usr / local / bin, puis créera le fichier .service et le mettre dans / etc / systemd / ::
cd cgi/
make install
Le serveur peut désormais être lancé de la même manière que les services système (il ne fonctionne que sur Ubuntu, car il place un fichier unitaire dans le dossier / etc / systemd / système / dossier, qui n'est pas installé sur d'autres systèmes). Selon la valeur par défaut, le serveur commencera à 127.0.0.1:1235. Pour définir vos paramètres, vous devez modifier le fichier de configuration:
service cgi start
service cgi stop
Lors du démarrage, le programme crée un fichier PID dans lequel il enregistre l'ID du processus actuel afin qu'à l'avenir vous puissiez lui envoyer un signal pour terminer le travail. Si une erreur s'est produite au début du serveur, le fichier n'est pas créé.
#!c
//creating PID file
FILE * file = fopen(path_to_pidfile, "a+");
fprintf(file, "%d", getpid());
fclose(file);
//killing running server
FILE * file = fopen(path_to_pidfile, "r+");
fscanf(file, "%d", &pid);
kill(pid, SIGTERM);
fclose(file);
remove(path_to_pidfile);
Ensuite, en utilisant un ensemble de fonctions pour travailler avec des sockets, nous configurons notre serveur. Si tout s'est écoulé sans erreurs, nous commençons à accepter les connexions entrantes. Pour chaque connexion adoptée, nous créons un processus distinct, le processus parental continue d'écouter.
#!c
pid_t pid = fork();
if (0 == pid) { //if it is child process - interact connection
handle_request(client_socket, &client_address, htdocs);
exit(0);
} else { //otherwise close socket and continue listening
close(client_socket);
}
La filiale lit la demande, la traite et donne à la page la réponse: si le fichier a été trouvé, la page correspondante est émise, sinon l'utilisateur recevra une page avec une erreur de 404. Toutes les statistiques sont stockées dans le dossier HTDOCS Server.
#!c
read(client_socket, recv_buffer, sizeof(recv_buffer));
char *query_str = parse_request(recv_buffer);
...
GET(client_socket, query_str, maindir);
Lorsque vous cliquez sur la page principale sur le bouton "Get actuel", un script qui renvoie la date / heure actuelle est effectuée:
#!c
if (strcmp(query_str + strlen(query_str) - 4, "cgi?") == 0) {
...
execve(main_dir, arg, empty2); //execute cgi-script
close(client_socket);
}
Pour le moment, il est mis en œuvre:
À venir: