TinyWebServer
Der leichte C++-Webserver unter Linux hilft Anfängern, schnell die Netzwerkprogrammierung zu üben und ihren eigenen Server zu erstellen.
- Parallelitätsmodell mit Thread-Pool + nicht blockierendem Socket + Epoll (sowohl von ET als auch von LT implementiert) + Ereignisverarbeitung (sowohl von Reactor als auch von simuliertem Proactor implementiert)
- Verwenden Sie die Zustandsmaschine zum Parsen von HTTP-Anforderungsnachrichten und unterstützen Sie das Parsen von GET- und POST- Anfragen
- Greifen Sie auf die Serverdatenbank zu, um Registrierungs- und Anmeldefunktionen für Webbenutzer zu implementieren, und können Sie Serverbilder und Videodateien anfordern
- Implementieren Sie ein synchrones/asynchrones Protokollsystem, um den Betriebsstatus des Servers aufzuzeichnen
- Nach dem Webbench-Stresstest können Zehntausende gleichzeitiger Verbindungsdatenaustausche erreicht werden
schreibe vorne
- Während der Entwicklung und Aufrechterhaltung dieses Projekts wurden vielen Kinderschuhen rote Umschläge angeboten, um mich zu unterstützen, aber ich lehnte alle ab. Ich werde dieses Projekt auch in Zukunft nicht in einen Kurs zum Verkauf packen und auch keine Supportkanäle eröffnen.
- Derzeit gibt es im Internet Leute, die dieses Projekt oder das Projekt von Youshuangdao in Kursen zum Verkauf verpacken. Bitte halten Sie die Augen offen und identifizieren Sie die C++-Serverprojekte der großen Lern-/Jobsuch-Websites, und zahlen Sie nicht blind.
- Ein leitender Interviewer fand mich über Projektinformationen im Unternehmen und stellte fest, dass dieses Projekt in den Lebensläufen vieler Kinder verwendet wurde. Während des Interviewprozesses stellte ich jedoch fest, dass
很多童鞋通过本项目入门了,但是对于一些东西还是属于知其然不知其所以然的状态,需要加强下基础知识的学习
.- „Fortgeschrittene Programmierung in Unix-Umgebungen“
- „Unix-Netzwerkprogrammierung“
- Vielen Dank an alle Chefs, Freunde und Kinderschuhe für Ihre Anerkennung und Unterstützung. Es wäre mir eine große Ehre, wenn dieses Projekt Ihnen den Einstieg ermöglichen könnte.
Inhaltsverzeichnis
Überblick | rahmen | Demo | Stresstest | Änderungsprotokoll | Quellcode herunterladen | Lauf schnell | Personalisierte Bedienung | Koch Ding Jie Niu | CPP11-Implementierung | Danksagungen |
---|
Überblick
- C/C++
- B/S-Modell
- Wrapper-Klasse für den Thread-Synchronisationsmechanismus
- Verarbeitungsklasse für HTTP-Verbindungsanforderungen
- Halbsynchroner/Halbreaktor-Thread-Pool
- Timer zur Verarbeitung inaktiver Verbindungen
- Synchrones/asynchrones Protokollierungssystem
- Datenbankverbindungspool
- Synchrone Thread-Registrierung und Anmeldeüberprüfung
- Einfacher Server-Stresstest
rahmen
Demo
- Melden Sie sich für eine Demo an
- Bilddateidemonstration anfordern (6M)
- Videodateidemonstration anfordern (39M)
Stresstest
Führen Sie nach dem Schließen des Protokolls einen Stresstest auf dem Server durch. Verwenden Sie den ET- und LT-Modus für listenfd und connfd. Nachfolgend sind die Testergebnisse nach der Kombination der beiden aufgeführt.
- Proactor, LT + LT, 93251 QPS
- Proactor, LT + ET, 97459 QPS
- Proactor, ET + LT, 80498 QPS
- Proaktor, ET + ET, 92167 QPS
- Reaktor, LT + ET, 69175 QPS
- Gesamtzahl gleichzeitiger Verbindungen: 10500
- Zugriffsserverzeit: 5s
- Alle Zugriffe waren erfolgreich
Hinweis: Wenn Sie die Webbench dieses Projekts für Stresstests verwenden und eine Fehlermeldung anzeigt, dass der Webbench-Befehl nicht gefunden werden kann, löschen Sie die ausführbare Datei Webbench und kompilieren Sie sie erneut.
Änderungsprotokoll
Quellcode herunterladen
Derzeit gibt es zwei Versionen. Es gibt große Änderungen in der Codestruktur zwischen den Versionen, und auch die Dokumentation und die Codeausführungsmethoden sind inkonsistent. Die überarbeitete Version ist prägnanter und die Originalversion (raw_version) ist größer, behält den ursprünglichen Geschmack des Youshuang-Codes bei und es ist einfacher, mit der Originalversion zu beginnen.
Wenn beim Herunterladen des Github-Codes ein Fehler auftritt oder der Zugriff zu langsam ist, können Sie ihn über den folgenden Link herunterladen und mit der neuesten Github-Übermittlung synchronisieren.
- Download-Adresse der überarbeiteten Version: BaiduYun
- Download-Adresse der Originalversion (raw_version): BaiduYun
- Extraktionscode: 9wye
- Informationen zum Ausführen der Originalversion finden Sie in der Originaldokumentation.
Lauf schnell
Servertestumgebung
- Ubuntu-Version 16.04
- MySQL-Version 5.7.29
Browser-Testumgebung
- Es sind sowohl Windows als auch Linux verfügbar
- Chrom
- FireFox
- Noch keine Tests mit anderen Browsern
Stellen Sie vor dem Testen sicher, dass die MySQL-Datenbank installiert ist
// 建立yourdb库
create database yourdb;
// 创建user表
USE yourdb;
CREATE TABLE user (
username char ( 50 ) NULL,
passwd char( 50 ) NULL
)ENGINE=InnoDB;
// 添加数据
INSERT INTO user (username, passwd) VALUES( ' name ' , ' passwd ' );
Ändern Sie die Datenbankinitialisierungsinformationen in main.cpp
//数据库登录名,密码,库名
string user = " root " ;
string passwd = " root " ;
string databasename = " yourdb " ;
bauen
Server starten
Browserseite
Personalisierte Bedienung
./server [-p port] [-l LOGWrite] [-m TRIGMode] [-o OPT_LINGER] [-s sql_num] [-t thread_num] [-c close_log] [-a actor_model]
Herzliche Erinnerung: Die oben genannten Parameter sind nicht erforderlich, Sie müssen nicht alle verwenden, Sie können sie entsprechend Ihrer persönlichen Situation auswählen.
- -p, benutzerdefinierte Portnummer
- -l, wählen Sie die Protokollschreibmethode aus. Der Standardwert ist synchrones Schreiben
- 0, synchrones Schreiben
- 1. Asynchrones Schreiben
- -m, Moduskombination aus listenfd und connfd, standardmäßig LT + LT
- 0 bedeutet, dass LT + LT verwendet wird
- 1 bedeutet die Verwendung von LT + ET
- 2 bedeutet die Verwendung von ET + LT
- 3 bedeutet die Verwendung von ET + ET
- -o, schließt die Verbindung ordnungsgemäß, wird standardmäßig nicht verwendet
- 0, nicht verwendet
- 1. Verwendung
- -s, Anzahl der Datenbankverbindungen
- -t, Anzahl der Threads
- -c, Protokoll schließen, standardmäßig öffnen
- 0, öffne das Protokoll
- 1. Schließen Sie das Protokoll
- -a, wählen Sie das Reaktormodell aus, der Standardwert ist Proactor
- 0, Proactor-Modell
- 1. Reaktormodell
Testen Sie Beispielbefehle und Bedeutungen
./server -p 9007 -l 1 -m 0 -o 1 -s 10 -t 10 -c 1 -a 1
Koch Ding Jie Niu
Die Iteration der neuesten Version ist schneller und der folgende Inhalt basiert zur detaillierten Erläuterung hauptsächlich auf dem Code der alten Version (raw_version).
- Die Perspektive eines Anfängers: Verstehen Sie den TinyWebServer des Präsidenten in einem Artikel
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts – 01 Thread-Synchronisationsmechanismus-Kapselungsklasse
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts - 02 Halbsynchroner Halbreaktor-Thread-Pool (Teil 1)
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts - 03 Halbsynchroner Halbreaktor-Thread-Pool (Teil 2)
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts - 04 HTTP-Verbindungsverarbeitung (Teil 1)
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts - 05 HTTP-Verbindungsverarbeitung (Teil 2)
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts - 06 HTTP-Verbindungsverarbeitung (Teil 2)
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts - 07 Timer-Verarbeitung inaktiver Verbindungen (Teil 1)
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts - 08 Timer-Verarbeitung inaktiver Verbindungen (Teil 2)
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts - 09 Protokollierungssystem (Teil 1)
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts – 10 Protokollierungssystem (Teil 2)
- Ausführliche Erläuterung der neuesten Version des Webserverprojekts – 11 Datenbankverbindungspool
- Detaillierte Erläuterung der neuesten Version des Webserverprojekts - 12 Registrieren und anmelden
- Ausführliche Erklärung der neuesten Version des Webserverprojekts – 13 Fallstricke und Interviewfragen
- Aktualisiert
Sternengeschichte
CPP11-Implementierung
Eine einfachere und elegantere CPP11-Implementierung: Webserver
Danksagungen
Linux-Hochleistungsserverprogrammierung, geschrieben von You Shuang.
Vielen Dank an die folgenden Freunde für PR und Hilfe: @RownH, @mapleFU, @ZWiley, @zjuHong, @mamil, @byfate, @MaJun827, @BBLiu-coder, @smoky96, @yfBong, @liuwuyao, @Huixxi, @markparticle , @ blogg9ggg.