Costruisci un semplice server HTTP in C [chiuso]
-
05-07-2019 - |
Domanda
Devo creare un semplice server HTTP in C. Qualche consiglio? Link? I campioni?
Soluzione
Ti suggerisco di dare un'occhiata a piccolo httpd . Se vuoi scriverlo da zero, allora dovresti approfondire leggere RFC 2616 . Utilizza socket BSD per accedere alla rete a un livello molto basso.
Altri suggerimenti
Ti consiglio di dare un'occhiata a: Una guida pratica alla scrittura di client e server
Quello che devi implementare in passaggi incrementali è:
- Esegui il tuo layer socket TCP di base (ascolta su porte / porte, accetta connessioni client e invia / ricevi dati).
- Implementa un lettore con buffer in modo da poter leggere le richieste una riga (delimitata da CRLF) alla volta.
- Leggi la prima riga. Analizzare il metodo, la versione della richiesta e il percorso.
- Implementa l'analisi dell'intestazione per " Header: value " sintassi. Non dimenticare di aprire le intestazioni piegate.
- Controlla il metodo di richiesta, il tipo di contenuto e la dimensione del contenuto per determinare come / se il corpo verrà letto.
- Implementa la decodifica del contenuto in base al tipo di contenuto.
- Se hai intenzione di supportare HTTP 1.1, implementa cose come " 100 Continua " ;, keep-alive, trasferimento chunked.
- Aggiungi misure di robustezza / sicurezza come rilevare richieste incomplete, limitare il numero massimo di clienti ecc.
- Riduci a capo il tuo codice e open-source :)
Un server HTTP è concettualmente semplice:
- Apri la porta 80 per l'ascolto
- Quando viene stabilito il contatto, raccogli un po 'di informazioni (ottieni principalmente - per ora puoi ignorare il resto)
- Traduci la richiesta in una richiesta di file
- Apri il file e rispediscilo al client
Diventa più difficile a seconda della quantità di HTTP che vuoi supportare: il POST è un po 'più complicato, gli script, la gestione di richieste multiple, ecc.
Ma la base è molto semplice.
Mongoose (precedentemente semplice daemon HTTP) è abbastanza buono. In particolare, è integrabile e può essere compilato su Windows, Windows CE e UNIX.
Apri un socket TCP sulla porta 80, inizia ad ascoltare nuove connessioni, implementa this . A seconda dei tuoi scopi, puoi ignorare quasi tutto. Nella migliore delle ipotesi, è possibile inviare la stessa risposta per ogni richiesta, che implica solo la scrittura di testo nel socket.
Guarda nweb (Nigel's Web Server), "un server Web minuscolo e sicuro [...] con solo 200 righe di codice sorgente C":
https://drive.google.com/file/d/ 0B3msld7qnNOhN1NXaFIwSFU2Mjg / vista? USP = condivisione
http://www.ibm.com/developerworks/systems/library / ES-nWeb /
L'articolo include pseudocodice, spiegazioni e commenti.
EDIT: il link IBM è morto. Ho salvato un PDF della pagina Web su Google Drive. Ecco il download del codice:
https://drive.google.com/file/d/ 0B3msld7qnNOhSGZGdDJJMmY0VHM / vista? USP = condivisione
@ ankushagarwal ha apportato alcune modifiche e ha caricato la sua versione su GitHub: https://github.com/ankushagarwal/nweb
Ho scritto il mio che puoi usare. Questo funziona con sqlite, è thread-safe ed è in C ++ per UNIX.
Dovresti essere in grado di separarlo e utilizzare il codice compatibile C.
Le Specifiche HTTP e Firebug sono stati molto utili per me quando ho dovuto farlo per i miei compiti.
Buona fortuna con i tuoi. :)
Suggerirei di guardare la fonte a qualcosa come lighthttpd .
http://www.manning.com/hethmon/ - " Guida illustrata a HTTP di Paul S. Hethmon " da Manning è un ottimo libro per imparare il protocollo HTTP e sarà molto utile per qualcuno che lo implementa / lo estende.
Utilizza le funzioni socket specifiche della piattaforma per incapsulare il protocollo HTTP, proprio come hanno fatto i ragazzi dietro Apache .
Esiste un duplicato con più risposte .
Un candidato non ancora menzionato è spserver .