2013-07-25 10 views
5

Sto usando qualcosa di simile per creare un server usando C. Quando vado a 127.0.0.1:5000 dal mio browser, posso vedere "Hello Worlds" mentre lo invio come buffer. Ma voglio che 127.0.0.1:5000/filename.html funzioni. Ma io non so come ottenere filename che viene dopo 127.0.0.1:5000 in C.Ottieni l'indirizzo richiesto nella programmazione socket con C

Sto usando questo per fare il collegamento:

serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    serv_addr.sin_port = htons(5000); 

    bind(listenfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr)); 

    connfd = accept(listenfd, (struct sockaddr*)NULL ,NULL); 
+0

stai implementando il server http? –

+0

Sì! Una specie di :) – sadaf2605

+0

@ sadaf2605: Ho aggiornato la mia risposta, per qualche motivo non posso commentarla – dreamlax

risposta

5

Il browser invierà il server una richiesta HTTP che contiene l'URL è dopo. La richiesta potrebbe apparire così:

GET /filename.html HTTP/1.1 
Host: 127.0.0.1:5000 

Il vostro programma C deve leggere questa richiesta dalla presa e analizzare esso per trovare l'URL. Si noti che la richiesta conterrà probabilmente più informazioni rispetto a quanto sopra, ma dovrebbe sempre terminare con una riga vuota (in modo da sapere dove interrompere l'analisi). Le righe nelle richieste HTTP devono terminare con un ritorno a capo e un avanzamento riga ("\r\n").

Si ricevono dati tramite lo stesso socket che si utilizza per inviare i dati. I passaggi per leggere una richiesta HTTP potrebbe essere simile a questo:

  1. Dichiarare un buffer di dimensioni sufficienti, forse 4096 byte o più.

  2. Leggere i dati in questo buffer usando read e la tua connfd fino:

    1. Hai ricevuto 4095 byte (nel qual caso il server dovrebbe rispondere con l'errore 413)

    2. Hai incontrato il caratteri "\r\n\r\n" (ciò indica una riga vuota)

    3. Un po 'di tempo è trascorso e nessuno dei precedenti si è verificato. Per implementare un timeout è necessario utilizzare select() o poll().

  3. Una volta ricevuta la richiesta HTTP nel buffer, analizzarlo:

    1. La prima riga è la linea richiesta che detta il metodo della richiesta, l'URI, e il numero di versione del protocollo. Un modo possibile per analizzare questa linea è dividerlo per spazio.

    2. Le righe successive rappresentano i campi di intestazione HTTP e possono generalmente essere analizzati come Key: Value\r\n. Questi campi di intestazione contengono i cookie, le informazioni relative al cliente che effettua la richiesta, ecc

  4. È necessario formare il vostro HTTP risposta pure.Una risposta per quando l'URI specifica una risorsa valida (ad esempio filename.html) potrebbe essere:

    HTTP/1.1 200 OK 
    Date: Thu, 25 Jul 2013 03:55:00 GMT 
    Server: sadaf2605-server/1.0 
    Content-Type: text/html 
    Content-Length: 40595 
    
    < contents of filename.html follows here > 
    

    In precedenza, Content-Length si riferisce al numero di byte del file filename.html. Proprio come la richiesta, una risposta viene separata dai dati utilizzando una riga vuota.

+1

HTTP 1.1 è specificato in [RFC 2616] (http://www.rfc-editor.org/rfc/rfc2616. testo). – Casey

+0

Puoi aiutarmi un po 'di più? Come posso ottenere/leggere/ricevere la richiesta GET in C? Sto ancora cercando! :/ – sadaf2605

0

Quando i dati vengono ricevuti nello stato corretto, provare ad analizzarli come richiesta http. Attendere per CRLF CRLF (indicativo della fine di intestazioni HTTP) prima di parsing nulla,

#define CRLF "\r\n" 

allora si dovrebbe cercare di stringa all'interno di una stringa utilizzando

strnstr(data,CRLF CRLF,data_len) 

Poi url si trova proprio accanto a questo, fare +1 e troverai lì.

+0

La mia domanda era come avrei recuperato l'URL del richiedente:/ – sadaf2605

+0

Spiacente, ho modificato la mia risposta, ora vedere – Ishmeet

Problemi correlati