TinyWebServer
Облегченный веб-сервер C++ под Linux помогает новичкам быстро попрактиковаться в сетевом программировании и создать собственный сервер.
- Модель параллелизма с использованием пула потоков + неблокирующий сокет + epoll (реализуется как ET, так и LT) + обработка событий (реализуется как Reactor, так и моделируемым Proactor)
- Используйте конечный автомат для анализа сообщений HTTP-запросов, поддержки анализа запросов GET и POST .
- Доступ к базе данных сервера для реализации функций регистрации и входа в Интернет-пользователей, а также возможность запроса изображений и видеофайлов с сервера.
- Внедрить синхронную/асинхронную систему журналов для записи состояния работы сервера.
- После стресс-теста Webbench можно достичь десятков тысяч одновременных обменов данными о соединениях.
напиши впереди
- Во время разработки и поддержки этого проекта многим детям детской обуви предлагали красные конверты, чтобы поддержать меня, но я от них всех отказался. Я не буду и в будущем объединять этот проект в какой-либо курс для продажи и не буду открывать какие-либо каналы поддержки.
- В настоящее время в Интернете есть люди, которые упаковывают этот проект или проект Юшуандао в курсы для продажи. Пожалуйста, внимательно следите за серверными проектами C++ на крупных веб-сайтах по обучению и поиску работы и не платите вслепую.
- Старший интервьюер нашел меня в компании через информацию о проекте и обнаружил, что во многих детских резюме использовался этот проект. Однако в ходе собеседования я обнаружил, что
很多童鞋通过本项目入门了,但是对于一些东西还是属于知其然不知其所以然的状态,需要加强下基础知识的学习
. Рекомендуется внимательно прочитать его. .- «Продвинутое программирование в среде Unix».
- «сетевое программирование unix»
- Спасибо всем начальству, друзьям и детской обуви за признание и поддержку. Для меня было бы большой честью, если бы этот проект помог вам начать.
Оглавление
Обзор | рамка | Демо | стресс-тест | Журнал изменений | Загрузка исходного кода | Беги быстро | Персонализированное управление | Кук Дин Цзе Ню | Реализация CPP11 | Благодарности |
---|
Обзор
- С/С++
- Модель Б/С
- Класс-оболочка механизма синхронизации потоков
- класс обработки запроса HTTP-соединения
- Полусинхронный/полуреакторный пул потоков
- Таймер для обработки неактивных соединений
- Синхронная/асинхронная система журналирования
- Пул соединений с базой данных
- Синхронная регистрация тредов и проверка входа
- Простой стресс-тест сервера
рамка
Демо
- Зарегистрируйтесь для демо-версии
- Запросить демонстрацию файла изображения (6M)
- Запросить демонстрацию видеофайла (39M)
стресс-тест
После закрытия журнала используйте 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
- Время доступа к серверу: 5 с
- Все доступы прошли успешно
Примечание. Если при использовании веббенч этого проекта для стресс-тестирования появляется сообщение об ошибке, указывающее, что команду веббенч невозможно найти, удалите исполняемый файл веббенч и перекомпилируйте.
Журнал изменений
Загрузка исходного кода
В настоящее время существует две версии. Между версиями происходят серьезные изменения в структуре кода, а также противоречивы документация и методы выполнения кода. Рефакторинговая версия более лаконична, а исходная версия (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, комбинация режимов прослушивания и 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)
- Подробное объяснение последней версии проекта веб-сервера — обработка HTTP-соединений 04 (часть 1)
- Подробное объяснение последней версии проекта веб-сервера — обработка http-соединений 05 (часть 2)
- Подробное объяснение последней версии проекта веб-сервера — обработка http-соединений 06 (часть 2)
- Подробное объяснение последней версии проекта веб-сервера - 07 Таймер обработки неактивных соединений (Часть 1)
- Подробное объяснение последней версии проекта веб-сервера - 08 Таймер обработки неактивных соединений (Часть 2)
- Подробное объяснение последней версии проекта веб-сервера — 09 Система журналирования (Часть 1)
- Подробное объяснение последней версии проекта веб-сервера — 10 Система журналирования (Часть 2)
- Подробное объяснение последней версии проекта веб-сервера — 11. Пул подключений к базе данных.
- Подробное объяснение последней версии проекта веб-сервера - 12 Зарегистрируйтесь и войдите в систему.
- Подробное объяснение последней версии проекта веб-сервера — 13 подводных камней и вопросы для собеседования
- Обновлено
Звездная история
Реализация CPP11
Более простая и элегантная реализация CPP11: веб-сервер.
Благодарности
Программирование высокопроизводительного сервера для Linux, написанное Ю Шуаном.
Спасибо следующим друзьям за пиар и помощь: @RownH, @mapleFU, @ZWiley, @zjuHong, @mamil, @byfate, @MaJun827, @BBLiu-coder, @smoky96, @yfBong, @liuwuyao, @Huixxi, @markparticle , @ blogg9ggg.