TinyWebServer
เว็บเซิร์ฟเวอร์น้ำหนักเบา C++ บน Linux ช่วยให้ผู้เริ่มต้นฝึกการเขียนโปรแกรมเครือข่ายและสร้างเซิร์ฟเวอร์ของตนเองได้อย่างรวดเร็ว
- โมเดลการทำงานพร้อมกันโดยใช้ เธรดพูล + ซ็อกเก็ตที่ไม่ปิดกั้น + epoll (ใช้งานโดยทั้ง ET และ LT) + การประมวลผลเหตุการณ์ (ใช้งานโดยทั้ง Reactor และ Proactor จำลอง)
- ใช้ เครื่องสถานะ เพื่อแยกวิเคราะห์ข้อความคำขอ HTTP รองรับการแยกวิเคราะห์คำขอ GET และ POST
- เข้าถึงฐานข้อมูลเซิร์ฟเวอร์เพื่อใช้ การลงทะเบียนผู้ใช้เว็บและฟังก์ชันการเข้าสู่ระบบ และสามารถขอ รูปภาพและไฟล์วิดีโอ ของเซิร์ฟเวอร์ได้
- ใช้ ระบบบันทึกซิงโครนัส/อะซิงโครนัส เพื่อบันทึกสถานะการทำงานของเซิร์ฟเวอร์
- หลังจากการทดสอบความเครียดของ Webbench สามารถทำการแลกเปลี่ยนข้อมูล การเชื่อมต่อพร้อมกันนับหมื่นครั้ง ได้
เขียนไว้ข้างหน้า
- ในระหว่างการพัฒนาและบำรุงรักษาโครงการนี้ รองเท้าเด็กจำนวนมากได้รับอั่งเปาเพื่อสนับสนุนฉัน แต่ฉันปฏิเสธทั้งหมด ฉันจะไม่และในอนาคต ฉันจะไม่รวมโปรเจ็กต์นี้ไว้ในหลักสูตรใดๆ เพื่อขาย และจะไม่เปิดช่องทางการสนับสนุนใดๆ
- ปัจจุบันมีคนบนอินเทอร์เน็ตที่รวมโครงการนี้หรือโครงการของ Youshuangdao ไว้ในหลักสูตรเพื่อขาย โปรดจับตาดูและระบุโปรเจ็กต์เซิร์ฟเวอร์ C++ ของเว็บไซต์การเรียนรู้/หางานหลักๆ และอย่าจ่ายเงินแบบสุ่มสี่สุ่มห้า
- ผู้สัมภาษณ์อาวุโสคนหนึ่งพบฉันในบริษัทจากข้อมูลโครงการ และพบว่าเรซูเม่ของเด็กๆ จำนวนมากใช้โปรเจ็กต์นี้ อย่างไรก็ตาม ในระหว่างกระบวนการสัมภาษณ์ ฉันพบว่า
很多童鞋通过本项目入门了,但是对于一些东西还是属于知其然不知其所以然的状态,需要加强下基础知识的学习
แนะนำให้อ่านอย่างละเอียด .- "การเขียนโปรแกรมขั้นสูงในสภาพแวดล้อม Unix"
- "การเขียนโปรแกรมเครือข่ายยูนิกซ์"
- ขอขอบคุณหัวหน้า เพื่อน และรองเท้าเด็กทุกคนที่ให้การยอมรับและให้การสนับสนุน มันจะเป็นเกียรติอย่างยิ่งสำหรับฉันหากโครงการนี้สามารถช่วยให้คุณเริ่มต้นได้
สารบัญ
ภาพรวม | กรอบ | สาธิต | การทดสอบความเครียด | บันทึกการเปลี่ยนแปลง | ดาวน์โหลดซอร์สโค้ด | วิ่งเร็ว | การดำเนินงานส่วนบุคคล | กุ๊กติงเจียหนิว | การดำเนินการ CPP11 | รับทราบ |
---|
ภาพรวม
- ซี/ซี++
- รุ่นบี/เอส
- คลาส wrapper กลไกการซิงโครไนซ์เธรด
- คลาสการประมวลผลคำขอการเชื่อมต่อ http
- พูลเธรดแบบกึ่งซิงโครนัส/กึ่งรีแอคเตอร์
- จับเวลาเพื่อจัดการการเชื่อมต่อที่ไม่ได้ใช้งาน
- ระบบบันทึกแบบซิงโครนัส/อะซิงโครนัส
- พูลการเชื่อมต่อฐานข้อมูล
- การลงทะเบียนเธรดแบบซิงโครนัสและการตรวจสอบการเข้าสู่ระบบ
- การทดสอบความเครียดเซิร์ฟเวอร์อย่างง่าย
กรอบ
สาธิต
- ลงทะเบียนเพื่อรับการสาธิต
การทดสอบความเครียด
หลังจากปิดบันทึก ให้ใช้ Webbench เพื่อทำการทดสอบความเครียดบนเซิร์ฟเวอร์ ใช้โหมด ET และ LT สำหรับ Listenfd และ Connfd ตามลำดับ ทั้งสองโหมดสามารถบรรลุการเชื่อมต่อพร้อมกันนับหมื่นครั้ง
- โพรแอคเตอร์, LT + LT, 93251 QPS
- โพรแอคเตอร์, LT + ET, 97459 QPS
- โพรแอคเตอร์, ET + LT, 80498 QPS
- โพรแอคเตอร์, ET + ET, 92167 QPS
- เครื่องปฏิกรณ์ LT + ET, 69175 QPS
- จำนวนการเชื่อมต่อพร้อมกันทั้งหมด: 10500
- เข้าถึงเวลาเซิร์ฟเวอร์: 5s
- การเข้าถึงทั้งหมดสำเร็จ
หมายเหตุ: เมื่อใช้ webbench ของโปรเจ็กต์นี้สำหรับการทดสอบภาวะวิกฤต หากข้อความแสดงข้อผิดพลาดแสดงว่าไม่พบคำสั่ง webbench ให้ลบไฟล์ปฏิบัติการ webbench และคอมไพล์ใหม่
บันทึกการเปลี่ยนแปลง
ดาวน์โหลดซอร์สโค้ด
ขณะนี้มีสองเวอร์ชัน มีการเปลี่ยนแปลงที่สำคัญในโครงสร้างโค้ดระหว่างเวอร์ชัน และเอกสารประกอบและวิธีการเรียกใช้โค้ดก็ไม่สอดคล้องกันเช่นกัน เวอร์ชันที่ปรับโครงสร้างใหม่มีความกระชับมากกว่า และเวอร์ชันดั้งเดิม (raw_version) มีขนาดใหญ่กว่า โดยยังคงรักษารสชาติดั้งเดิมของโค้ด Youshuang และง่ายต่อการเริ่มต้นด้วยเวอร์ชันดั้งเดิม
หากคุณพบความล้มเหลวในการดาวน์โหลดโค้ด Github หรือการเข้าถึงช้าเกินไป คุณสามารถดาวน์โหลดได้จากลิงก์ต่อไปนี้และซิงโครไนซ์โค้ดกับการส่ง Github ล่าสุด
- ที่อยู่ดาวน์โหลดเวอร์ชันที่ปรับโครงสร้างใหม่: BaiduYun
- ที่อยู่ดาวน์โหลดเวอร์ชันต้นฉบับ (raw_version): BaiduYun
- รหัสการสกัด: 9wye
- หากต้องการเรียกใช้เวอร์ชันดั้งเดิม โปรดดูเอกสารต้นฉบับ
วิ่งเร็ว
สภาพแวดล้อมการทดสอบเซิร์ฟเวอร์
- อูบุนตูเวอร์ชัน 16.04
- MySQL เวอร์ชัน 5.7.29
สภาพแวดล้อมการทดสอบเบราว์เซอร์
- มีทั้ง Windows และ Linux
- โครเมียม
- ไฟร์ฟ็อกซ์
- ยังไม่มีการทดสอบบนเบราว์เซอร์อื่น
ตรวจสอบให้แน่ใจว่าได้ติดตั้งฐานข้อมูล MySQL ก่อนการทดสอบ
// 建立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 ' );
แก้ไขข้อมูลการเริ่มต้นฐานข้อมูลใน main.cpp
//数据库登录名,密码,库名
string user = " root " ;
string passwd = " root " ;
string databasename = " yourdb " ;
สร้าง
เริ่มเซิร์ฟเวอร์
ด้านเบราว์เซอร์
การดำเนินงานส่วนบุคคล
./server [-p port] [-l LOGWrite] [-m TRIGMode] [-o OPT_LINGER] [-s sql_num] [-t thread_num] [-c close_log] [-a actor_model]
คำเตือนที่อบอุ่น: พารามิเตอร์ข้างต้นไม่จำเป็น คุณไม่จำเป็นต้องใช้ทั้งหมด คุณสามารถเลือกได้ตามสถานการณ์ส่วนตัวของคุณ
- -p หมายเลขพอร์ตที่กำหนดเอง
- -l เลือกวิธีการเขียนบันทึก ค่าเริ่มต้นคือการเขียนแบบซิงโครนัส
- 0 การเขียนแบบซิงโครนัส
- 1. การเขียนแบบอะซิงโครนัส
- -m การรวมกันของโหมด Listenfd และ connfd มีค่าเริ่มต้นเป็น LT + LT
- 0 หมายถึงใช้ LT + LT
- 1 หมายถึง ใช้ LT + ET
- 2 หมายถึง ใช้ ET + LT
- 3 หมายถึง ใช้ ET + ET
- -o ปิดการเชื่อมต่ออย่างสวยงาม ไม่ได้ใช้โดยค่าเริ่มต้น
- 0, ไม่ได้ใช้
- 1. การใช้งาน
- -s จำนวนการเชื่อมต่อฐานข้อมูล
- -t จำนวนเธรด
- -c ปิดบันทึก เปิดตามค่าเริ่มต้น
- 0 เปิดบันทึก
- 1. ปิดบันทึก
- -a เลือกรุ่นเครื่องปฏิกรณ์ ค่าเริ่มต้นคือ Proactor
- 0 รุ่นโปรแอคเตอร์
- 1. แบบจำลองเครื่องปฏิกรณ์
ทดสอบตัวอย่างคำสั่งและความหมาย
./server -p 9007 -l 1 -m 0 -o 1 -s 10 -t 10 -c 1 -a 1
กุ๊กติงเจียหนิว
การวนซ้ำเวอร์ชันล่าสุดนั้นเร็วกว่า และเนื้อหาต่อไปนี้ส่วนใหญ่จะอิงตามโค้ดเวอร์ชันเก่า (raw_version) สำหรับคำอธิบายโดยละเอียด
- มุมมองของมือใหม่: ทำความเข้าใจ TinyWebServer ของประธานาธิบดีในบทความเดียว
- คำอธิบายโดยละเอียดของเวอร์ชันล่าสุดของโครงการเว็บเซิร์ฟเวอร์ - 01 คลาสการห่อหุ้มกลไกการซิงโครไนซ์เธรด
- คำอธิบายโดยละเอียดของเวอร์ชันล่าสุดของโครงการเว็บเซิร์ฟเวอร์ - 02 เธรดพูลกึ่งเครื่องปฏิกรณ์กึ่งซิงโครนัส (ตอนที่ 1)
- คำอธิบายโดยละเอียดของเวอร์ชันล่าสุดของโครงการเว็บเซิร์ฟเวอร์ - 03 เธรดพูลกึ่งเครื่องปฏิกรณ์กึ่งซิงโครนัส (ตอนที่ 2)
- คำอธิบายโดยละเอียดของโครงการเว็บเซิร์ฟเวอร์เวอร์ชันล่าสุด - การประมวลผลการเชื่อมต่อ 04 http (ตอนที่ 1)
- คำอธิบายโดยละเอียดของโครงการเว็บเซิร์ฟเวอร์เวอร์ชันล่าสุด - การประมวลผลการเชื่อมต่อ 05 http (ตอนที่ 2)
- คำอธิบายโดยละเอียดของโครงการเว็บเซิร์ฟเวอร์เวอร์ชันล่าสุด - การประมวลผลการเชื่อมต่อ 06 http (ตอนที่ 2)
- คำอธิบายโดยละเอียดของเวอร์ชันล่าสุดของโครงการเว็บเซิร์ฟเวอร์ - 07 การประมวลผลตัวจับเวลาของการเชื่อมต่อที่ไม่ได้ใช้งาน (ตอนที่ 1)
- คำอธิบายโดยละเอียดของเวอร์ชันล่าสุดของโครงการเว็บเซิร์ฟเวอร์ - 08 การประมวลผลตัวจับเวลาของการเชื่อมต่อที่ไม่ได้ใช้งาน (ตอนที่ 2)
- คำอธิบายโดยละเอียดของโครงการเว็บเซิร์ฟเวอร์เวอร์ชันล่าสุด - 09 ระบบการบันทึก (ตอนที่ 1)
- คำอธิบายโดยละเอียดของโครงการเว็บเซิร์ฟเวอร์เวอร์ชันล่าสุด - 10 ระบบการบันทึก (ตอนที่ 2)
- คำอธิบายโดยละเอียดของโครงการเว็บเซิร์ฟเวอร์เวอร์ชันล่าสุด - พูลการเชื่อมต่อฐานข้อมูล 11 รายการ
- คำอธิบายโดยละเอียดของโครงการเว็บเซิร์ฟเวอร์เวอร์ชันล่าสุด - 12 ลงทะเบียนและเข้าสู่ระบบ
- คำอธิบายโดยละเอียดของโครงการเว็บเซิร์ฟเวอร์เวอร์ชันล่าสุด - ข้อผิดพลาด 13 ข้อและคำถามในการสัมภาษณ์
- อัปเดตแล้ว
ประวัติดารา
การดำเนินการ CPP11
การใช้งาน CPP11 ที่เรียบง่ายและสวยงามยิ่งขึ้น: เว็บเซิร์ฟเวอร์
รับทราบ
การเขียนโปรแกรมเซิร์ฟเวอร์ Linux ประสิทธิภาพสูง เขียนโดย You Shuang
ขอขอบคุณเพื่อนๆ ต่อไปนี้สำหรับการประชาสัมพันธ์และช่วยเหลือ: @RownH, @mapleFU, @ZWiley, @zjuHong, @mamil, @byfate, @MaJun827, @BBLiu-coder, @smoky96, @yfBong, @liuwuyao, @Huixxi, @markparticle , @blogg9gg.