2013-09-03 3 views
1

J'ai le code suivant pour le serveur dans C. Le navigateur Web servira de client. Jusqu'à présent, ce que je sais est que je dois exécuter le fichier exécutable à partir du terminal et ouvrir un navigateur Web et tapez: localhost:54321. 54321 est le numéro de port où nous devons exécuter le serveur Web. La prochaine chose que nous devons faire est d'analyser la requête http reçue du navigateur Web et d'obtenir le nom de l'objet demandé.Création d'un serveur Web simple à l'aide de sockets

Je sais comment analyser mais I don't know how to receive the object. Devrais-je utiliser form entrées pour obtenir le nom de l'objet?

Merci à l'avance! Juste un débutant dans la programmation socket et je ne suis capable de créer des sockets.

#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <stdlib.h> 
#include <unistd.h> 


int main(int argc, char **argv) 
{ 
    int listenfd,connfd; 
    struct sockaddr_in servaddr,cliaddr; 
    socklen_t len = sizeof(cliaddr); 
    char cli_ip[32]; 
    char mesg[1024]; 

    listenfd = socket(PF_INET,SOCK_STREAM,0); 
    bzero(&servaddr, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servaddr.sin_port = htons(54321); 
    if (bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr)) < 0){ 
     perror(NULL); 
     exit(-1); 
    } 

    //not present in udp server 
    listen(listenfd,2); 

    while(1){ 
     //not present in udp server 
    connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&len); 
    inet_ntop(AF_INET,(struct in_addr *) &cliaddr.sin_addr, cli_ip, sizeof(cli_ip)); 
    printf("Client %s connected. \n",cli_ip);  
    while(1){ 
     memset(mesg,0,sizeof(mesg)); 
     if(recvfrom(connfd,mesg,sizeof(mesg),0,(const struct sockaddr *)&cliaddr,&len) > 0){ 
      printf("From %s port %d: %s",cli_ip,ntohs(cliaddr.sin_port),mesg); 
     } 
     else { 
     printf("Client %s disconnected. \n",cli_ip);  
     break; 
     } 
    } 
    close(connfd); 
    } 
    close(listenfd); 
    return 0; 
} 

ÉDITÉ: Voici les spécifications exactes données:

Parse the HTTP request (using strtok) received from the web browser and obtain the name of the object requested. For example, index.html will be sent in the response: 
GET /index.html HTML/1.1 
Host: localhost:54321 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
+0

Pourriez vous vous expliquer plus? En particulier, vous dites "La prochaine chose que nous devons faire est d'analyser la requête HTTP reçue du navigateur web et d'obtenir le nom de l'objet demandé.Je sais comment analyser mais je ne sais pas comment recevoir l'objet." Si le navigateur Web demande un objet, pourquoi fournirait-il cet objet à recevoir? –

+0

@CortAmmon J'ai édité la question ci-dessus avec les spécifications exactes données. Nous devons faire un serveur web simple. – JKTA

Répondre

0

Je suppose que cela est un exercice de formation?

Vous devez continuer à lire depuis le socket et l'analyse au fur et à mesure, jusqu'à ce que vous ayez déterminé que vous avez lu tout l'en-tête. Ensuite, vous devez l'analyser (si vous ne l'avez pas déjà fait) et envoyer une réponse. Donc, vous ne pouvez pas avoir un seul recvfrom(), vous devez boucler.

Il ne traitera pas (efficacement) plusieurs navigateurs jusqu'à ce que vous le supportiez explicitement, via des processus d'interrogation/sélection et/ou des processus et/ou des processus bifurqués.