C ++ Web Development: Willst du einen minimalistischen Start [geschlossen]

8

Ich arbeite derzeit an einem Informatik-Abschluss und möchte meine eigene Webserver-Bibliothek erstellen. Das Problem? Jede Suche, die ich bei der Interaktion mit Websites durchgeführt habe, verweist auf "Diese Bibliothek verwenden, die von einer anderen Person erstellt wurde" - anstatt die Grundlagen des Sendens und Empfangens von Informationen zu erläutern.

Ich verlange nicht viel - ich möchte nur ein einzelnes alphanumerisches Zeichen auf einer Webseite eingeben, eine Schaltfläche drücken und dieses eine Byte an Informationen an ein C ++ - Programm senden lassen, ohne die Hilfe eines Nicht-Standards Bibliothek.

Christopher Ivey
quelle
3
Haben Sie Apache (oder die meisten anderen Webserver) und die gemeinsame Gateway-Oberfläche in Betracht gezogen ? Oder Apache mit einem C ++ - Plugin (zugehörige Tutorials )?
Ein weiterer Vorschlag wäre Mongrel 2. Es sendet lediglich Anforderungen an das Zielprogramm und empfängt die Ausgabe über ZeroMQ-Sockets.
Will
Es gibt auch Boost ASIO, wenn Sie wirklich niedrig starten wollen
Daniel Gratzer
Dies sollte wirklich bewegt werden über stackoverflow.com
Gummistiefel

Antworten:

6

Boost.Asio wird derzeit konvertiert, um (eine von?) Die zukünftige C ++ - Standardmethode für das Networking zu sein. (Hier ist eines der Papiere: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3388.pdf )

Es ist wirklich das grundlegendste tragbare asynchrone Kommunikationssystem, das Sie mit modernem C ++ finden, da es andere Socket-Bibliotheken oder von Plattformen bereitgestellte abstrahiert.

Alle modernen C ++ http-Netzwerkbibliotheken ( CppNetlib und CPPCMS ) sind darauf angewiesen. Ich schlage vor, Sie bauen Ihre Bibliothek darauf auf und bieten Grundlagen für Sockets und asynchrone (und synchrone) Kommunikation, richten jedoch kein vollständiges System für Sie ein. Vielleicht können Sie in ein paar Jahren sogar Boost.ASIO durch das C ++ - Standardäquivalent ersetzen.

Die Dokumentation von Boost.Asio bietet auch Einblicke in die Funktionsweise der Kommunikation in diesem Kontext. Wenn Sie es lesen, werden möglicherweise viele Ihrer Fragen beantwortet.

Und wenn Sie die untere Ebene verstehen möchten, lesen Sie den Asio-Code. Es ist ein bisschen schwer zu lesen, wenn Sie nicht an C ++ - Metaprogrammierung und andere C ++ - Redewendungen gewöhnt sind, aber Sie würden viel lernen, wenn Sie es lesen.

Klaim
quelle
2

Einige der gewünschten Informationen finden Sie hier - http://en.wikipedia.org/wiki/Common_Gateway_Interface . Es hört sich vielleicht nicht so an, als wäre das, was Sie versuchen, sehr kompliziert, aber es ist etwas komplizierter, als Sie vielleicht denken. Wie Dominic sagte, wird der schwierige Teil darin bestehen, den Port zu öffnen und aus dem Socket zu lesen - in C ++ - Land ziemlich schwierig.

Ich würde empfehlen, zunächst einen vorhandenen Webserver zu verwenden und ein eigenes CGI-Modul zu schreiben. Der Webserver kümmert sich um die Sockets-Seite, und im Grunde lesen Sie nur Daten aus Umgebungsvariablen oder Befehlszeilenargumenten (wenn es sich um eine GET-Anforderung handelt) oder aus dem Standard, wenn es sich um einen POST handelt (ich denke, dies sind Daten aus meiner Erinnerung, die ungefähr 15 Jahre alt ist). Was Sie wollen, ist ungefähr so:

#include <stdio.h>
#include <string.h>

int main(){
    char *s=getenv("CONTENT_LENGTH");
    int i=atoi(getenv("CONTENT_LENGTH"));
    printf("Content-type: text/html\n\n");
    printf("%s\n<br />",s); //Shows you CONTENT_LENGTH works
    printf("%d\n<br />",i); //Shows you it was converted to int
    char *tmp = new char[100];
    fread(tmp,i,1,stdin); //read from stdin something of i bytes to tmp
    printf("%s\n<br />",tmp);
    return 0;
}

Übrigens als Lektion für den Leser hat diese Anwendung einen Pufferüberlauf-Fehler. Sie möchten das wahrscheinlich beheben :)

Rocklan
quelle
1

Korrigieren Sie mich, wenn ich falsch liege, aber es klingt so, als ob Sie Ihren eigenen Webserver von Grund auf neu programmieren möchten, indem Sie nur Standard-C ++ - Komponenten verwenden.

Zunächst einmal befinden Sie sich in einer schwierigen Situation, da es keine Standard-TCP / IP-Socket-Bibliothek gibt. Daher müssen Sie je nach Plattform Windows-Sockets oder Posix-Sockets verwenden.

Dann müssen Sie das Format der Anfragen / Antworten untersuchen. Ich bin mir sicher, dass Sie mit ein wenig Suchen eine Ressource im http-Protokoll finden werden.

Danach müssen Sie einen Server erstellen, der auf Verbindungen wartet, auf Anfragen reagiert und Antworten sendet.

Wenn Sie das nicht fragen, klingt der Vorschlag von MichaelT vernünftig.

Dominique McDonnell
quelle