2015-08-29 1 views
2

Je suis en train de créer simplement l'application FastCGI écrit en C:FCGX_Accept_r fonctionne deux fois en application simple FastCGI sur C

#include <fcgiapp.h> 
#include <stdio.h> 
int main() 
{ 
    int sockfd = FCGX_OpenSocket("127.0.0.1:9000", 1024); 
    FCGX_Request request; 

    FCGX_Init(); 
    FCGX_InitRequest(&request, sockfd, 0); 

    while (FCGX_Accept_r(&request) == 0) 
    { 
     printf("Accepted\n"); 
     FCGX_FPrintF(request.out, "Content-type: text/html\r\n\r\n<h1>Hello World!</h1>"); 
     FCGX_Finish_r(&request); 
    } 
} 

Il fonctionne très bien - quand je l'appelle à partir du navigateur, il affiche avec « Bonjour tout le monde! " message.

Le problème est que le code dans un « tout » fonctionne deux fois , à savoir que je vois sortie suivante dans le terminal:

[[email protected] example]$ ./hello 
Accepted 
Accepted 

Pourquoi elle imprime « Accepté » deux fois par chaque demande? Si je mets du code réel ici, p. interroger un DB, il sera exécuté deux fois aussi bien.

Répondre

3

Quel programme utilisez-vous pour effectuer la demande Web? Certains clients Web peuvent également demander par ex. fichier favicon.ico, ce qui peut expliquer la deuxième demande au processus fcgi:

127.0.0.1 - - [29/Aug/2015:16:02:11 +0000] "GET/HTTP/1.1" 200 32 "-" "..." 
127.0.0.1 - - [29/Aug/2015:16:02:11 +0000] "GET /favicon.ico HTTP/1.1" 200 32 "http://127.0.0.1/" "..." 

Cela pourrait être déterminé en examinant les journaux de serveur Web, ou l'ajout de débogage au programme C pour afficher les paramètres de la requête. En utilisant seulement telnet pour demander GET/HTTP/1.0, je ne vois pas de double hit pour une configuration de serveur web forward-everything-to-fcgi utilisant le serveur web nginx.

+0

Haw! La pause de cinq ans de la programmation Web a un effet. La seconde était vraiment une demande du navigateur à un favicon. Merci beaucoup! –

+0

Oui, c'était aussi la première chose à laquelle j'ai trébuché. – thrig