精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

利用多線程和 C++ 實現一個簡單的 HTTP 服務器

開發 前端
本文介紹一種使用 C++ 和 多線程實現的簡單 HTTP 服務器。

前言:服務器是現代軟件不可或缺的一部分,而服務器的技術也是非常復雜和有趣的方向。隨著操作系統不斷地發展,服務器的底層架構也在不斷變化。本文介紹一種使用 C++ 和 多線程實現的簡單 HTTP 服務器。

首先我們先來看一下如何創建一個服務器。

int main() 
{
int server_fd;
struct sockaddr_in server_addr;
server_fd = socket(AF_INET, SOCK_STREAM, 0);
int on = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
if (server_fd < 0) {
perror("create socket error");
goto EXIT;
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("bind address error");
goto EXIT;
}
if (listen(server_fd, 511) < 0) {
perror("listen port error");
goto EXIT;
}
while(1) {
int connfd = accept(server_fd, nullptr, nullptr);
if (connfd < 0)
{
perror("accept error");
continue;
}
// 處理
}
close(server_fd);
return 0;
EXIT:
exit(1);
}

我們看到根據操作系統提供的 API,創建一個 TCP 服務器非常簡單 ,只需要調用幾個函數就行。最后進程會阻塞在 accept 等待連接的到來,我們在一個死循環中串行地處理每個請求。顯然,這樣的效率肯定非常低,因為如果我們使用傳統的 read / write 函數的話,它是會引起進程阻塞的,這樣就會導致多個請求需要排隊進行處理。我們在此基礎上利用多線程提高一下效率。

std::thread threads[MAX_THREAD];
std::condition_variable condition_variable;
std::deque<int> requests;
std::mutex mutex;
for (int i = 0; i < MAX_THREAD; i++) {
threads[i] = std::thread(worker, &mutex, &condition_variable, &requests);
}

多線程就會涉及到并發 / 同步的問題,所以需要使用互斥變量和條件變量來處理這些問題。上面的代碼創建了幾個線程,然后在每個線程中執行 worker 函數來處理請求,除此之外,用 requests 變量來表示請求隊列,該變量會由主線程和子線程一起訪問。具體是由主線程生產任務,子線程消費。在了解子線程邏輯之前先看看主線程代碼的改動。

while(1) {
int connfd = accept(server_fd, nullptr, nullptr);
if (connfd < 0)
{
perror("accept error");
continue;
}
{
std::lock_guard<std::mutex> lock(mutex);
requests.push_back(connfd);
condition_variable.notify_one();
}
}

我們看到當主線程收到請求時,自己不處理,而是添加到請求隊列讓子線程處理,因為子線程沒有任務處理時會自我阻塞,所以主線程需要喚醒一個線程來處理新的請求。接下來看看子線程的邏輯。

void worker(std::mutex *mutex,
std::condition_variable *condition_variable,
std::deque<int> *requests) {
int connfd;
while (true) {
{
std::unique_lock<std::mutex> lock(*mutex);
// 沒有任務則等待,否則取出任務處理
while ((*requests).size() == 0)
{
(*condition_variable).wait(lock);
}
connfd = (*requests).front();
(*requests).pop_front();
}
char buf[4096];
int ret;
while (1) {
memset(buf, 0, sizeof(buf));
int bytes = read(connfd, buf, sizeof(buf));
if (bytes <= 0) {
close(connfd);
} else {
write(connfd, buf, bytes);
}
}
}
}

子線程不斷從任務隊列中取出任務,具體來說就是連接對應的文件描述符,然后不斷讀取里面的數據,最后返回給客戶端。但是這樣的功能顯然沒有太大意義,所以我們基于這個基礎上實現一個 HTTP 服務,讓它可以處理 HTTP 請求。當然我們手寫一個優秀的 HTTP 解析器并非易事,所以我們直接使用開源的就好,這里選擇的是 llhttp,這是 Node.js 所使用的 HTTP 解析器。這里就不具體羅列細節,大概介紹一下 llhttp 的用法。

typedef void (*p_on_headers_complete)(on_headers_complete_info, parser_callback);
typedef void (*p_on_body_complete)(on_body_complete_info, parser_callback);
typedef void (*p_on_body)(on_body_info, parser_callback);
struct parser_callback {
void * data;
p_on_headers_complete on_headers_complete;
p_on_body on_body;
p_on_body_complete on_body_complete;
};
class HTTP_Parser {
public:
HTTP_Parser(llhttp_type type, parser_callback callbacks = {});
int on_message_begin(llhttp_t* parser);
int on_status(llhttp_t* parser, const char* at, size_t length);
int on_url(llhttp_t* parser, const char* at, size_t length);
int on_header_field(llhttp_t* parser, const char* at, size_t length);
int on_header_value(llhttp_t* parser, const char* at, size_t length);
int on_headers_complete(llhttp_t* parser);
int on_body(llhttp_t* parser, const char* at, size_t length);
int on_message_complete(llhttp_t* parser);
int parse(const char* data, int len);
int finish();
void print();
};

HTTP_Parser 是我自己實現的 HTTP Parser Wrapper,主要是對 llhttp 的封裝,我們看到 HTTP_Parser 里有很多回調鉤子,對應的就是 llhttp 提供的,另外 HTTP_Parser 支持調用方傳入鉤子,也就是 parser_callback 所定義的。當 llhttp 回調 HTTP_Parser 時,HTTP_Parser 在合適的時機就會調用 parser_callback 里的回調,比如在解析完 HTTP Header 時,或者解析完整個報文時。具體的解析過程是當調用方收到數據時,執行 parse 函數,然后 llhttp 就會不斷地調用我們傳入的鉤子。了解了 HTTP 解析器的大致使用,我們來看看怎么在項目里使用。

parser_callback callback = {
&connfd,
[](on_body_complete_info info, parser_callback callback) {
int* connfd = (int *)callback.data;
const char * data = "HTTP/1.1 200 OK\r\nServer: multi-thread-server\r\ncontent-length: 11\r\n\r\nhello:world\r\n\r\n";
write(*connfd, data, strlen(data));
close(*connfd);
},
};
HTTP_Parser parser(HTTP_REQUEST, callback);
char buf[4096];
int ret;
while (1) {
memset(buf, 0, sizeof(buf));
int error = 0;
ret = read(connfd, buf, sizeof(buf));
parser.parse(buf, ret);
}

這里只列出關鍵的代碼,當我們收到數據時,我們通過 parser.parse(buf, ret) 調用 llhttp 進行解析,llhttp 就會不斷地回調鉤子函數,當解析完一個報文后,on_body_complete 回調就會被執行,在這里我們就可以對 HTTP 請求進行響應,比如這里返回一個 200 的響應報文,然后關閉連接。因為通過 llhttp 我們可以拿到具體的請求 url,所以我們還可以進一步拓展,根據 url 進行不同的處理。

到此為止,就實現了一個 HTTP 服務器了 ,在早期的時候,服務器也是采用這種多進程 / 多線程的處理方式,現在有了多路復用等技術后,很多服務器都是基于事件驅動來實現了。但是主線程接收請求,分發給子線程處理這種思想在有些服務器也還是存在的,比如 Node.js,只不過 Node.js 中是進程間進行傳遞。本文大概介紹到這里,服務器技術是非常復雜、有趣的方向,上層的架構也隨著操作系統的能力不斷在變化,本文只是作一個簡單的探索和興趣罷了,具體代碼在 https://github.com/theanarkh/multi-thread-server。下面是架構圖。

圖片

責任編輯:姜華 來源: 編程雜技
相關推薦

2019-04-24 15:06:37

Http服務器協議

2015-03-24 13:46:29

C++多線程計數器特性實現

2024-01-16 11:43:38

C++HashMap

2024-01-08 08:36:29

HTTPGo代理服務器

2009-02-27 11:15:00

多線程服務器MTS專用服務器

2018-03-01 10:45:25

HTTP服務器程序

2021-07-20 10:30:46

Golanghttp語言

2022-04-01 13:10:20

C++服務器代碼

2025-07-07 00:00:00

2019-05-08 14:37:49

Web服務器HTTP

2014-04-14 15:54:00

print()Web服務器

2017-12-27 09:49:35

HTTP服務器反向

2019-12-11 10:45:08

Python 開發編程語言

2016-11-08 18:53:08

編譯器

2009-08-25 01:46:00

C# WINDOWS服

2011-12-08 13:04:06

JavaNIO

2018-04-12 09:29:56

HTTP服務器問題

2012-05-18 10:36:20

CC++編程

2018-06-15 10:25:43

Python HTTPFTP服務器

2018-12-06 09:23:33

點贊
收藏

51CTO技術棧公眾號

亚洲人成网在线播放| 亚洲色图一区二区三区| 国模视频一区二区| 无码人妻一区二区三区在线| 欧美videos另类精品| 成人99免费视频| 日韩美女免费视频| 貂蝉被到爽流白浆在线观看| 国产亚洲久久| 亚洲一级二级在线| 蜜桃av噜噜一区二区三区| 福利网址在线观看| 91精品久久久久久久蜜月| 日韩欧美亚洲国产精品字幕久久久 | 2001个疯子在线观看| 91蜜桃视频在线| 国产精品日韩久久久久| 欧美做爰爽爽爽爽爽爽| 卡通动漫精品一区二区三区| 色婷婷精品大视频在线蜜桃视频| 亚洲一区综合| 全国男人的天堂网| 免费欧美在线视频| 久久久久久久久91| 国产综合精品久久久久成人av| 国产精品99久久免费| 精品久久久久久国产| 中文字幕久久一区| 无码精品在线观看| 国产综合久久久久影院| 日本高清不卡的在线| 国产尤物在线播放| 一本色道久久综合亚洲精品酒店| 制服丝袜一区二区三区| 狠狠爱免费视频| 手机av免费在线| 国产亚洲va综合人人澡精品 | www.伊人久久| 亚洲精品97| 亚洲小视频在线观看| 亚洲美女精品视频| 伊人久久大香伊蕉在人线观看热v| 亚洲国产乱码最新视频| 亚洲欧美一二三| 成在在线免费视频| 久久影院午夜片一区| 国产精品福利视频| 99热这里精品| 另类小说一区二区三区| 日韩**中文字幕毛片| 久久久久久欧美精品se一二三四 | 综合色婷婷一区二区亚洲欧美国产| 日本激情一区二区| 国产精品一区二区在线播放| 国产精品xxx视频| 久久久久久久久久影院| 99久久99久久精品国产片果冰| 亚洲理论在线a中文字幕| 国产国语老龄妇女a片| 国产亚洲字幕| 51精品秘密在线观看| 9l视频白拍9色9l视频| 都市激情亚洲一区| 色综合咪咪久久| koreanbj精品视频一区| av在线中出| 亚洲国产日韩精品| 99精品一区二区三区的区别| 午夜激情视频在线观看| 欧美国产一区在线| 神马影院午夜我不卡| 天天摸天天干天天操| 成人综合在线观看| av资源站久久亚洲| 日本激情一区二区三区| www.欧美日韩| 欧美日韩一区二区三| 三级国产在线观看| 国产欧美日韩在线观看| 日韩精品国内| 超碰免费在线| 成人欧美一区二区三区视频网页| 亚洲午夜激情| 国产在线高清视频| 亚洲精品一二三四区| 欧美日韩中文字幕在线播放| 18网站在线观看| 一区二区三区在线视频播放| 成人午夜视频免费观看| free性欧美| 欧美日韩在线视频首页| 国产精品久久久久9999小说| 91看片一区| 欧美日韩色综合| 亚洲图片 自拍偷拍| 国产+成+人+亚洲欧洲在线 | 亚洲 另类 春色 国产| 久久夜色精品一区| 日本一区二区精品视频| 免费在线观看av网站| 亚洲一区二区三区爽爽爽爽爽 | 禁久久精品乱码| 欧美在线视频网站| 国产又粗又猛视频免费| 成人一区二区在线观看| 日本日本精品二区免费| 超碰电影在线播放| 黑人巨大精品欧美一区二区| 天天爽夜夜爽一区二区三区| 午夜免费欧美电影| 精品偷拍各种wc美女嘘嘘| 成人免费毛片东京热| 丝袜a∨在线一区二区三区不卡| 亚洲a中文字幕| 国内三级在线观看| 亚洲国产日韩在线一区模特| 国内外成人免费在线视频| 神马香蕉久久| 欧美—级a级欧美特级ar全黄| 做爰视频毛片视频| 久久综合色之久久综合| 国产精品久久久久久久久电影网| 国产91精品在线| 精品中文字幕久久久久久| 欧美黄色一级网站| 狠狠色丁香九九婷婷综合五月| 久久亚洲午夜电影| 999福利在线视频| 91精品国产手机| 国精产品视频一二二区| 日日骚欧美日韩| 欧美激情视频一区二区三区| 草草视频在线| 精品少妇一区二区三区在线播放| 中文字幕美女视频| 秋霞午夜av一区二区三区| 欧美不卡三区| 亚洲精品成人图区| 日韩久久午夜影院| 亚洲AV无码成人精品区东京热| 岛国一区二区三区| 欧美这里只有精品| 在线精品自拍| 久久91精品国产| 性做久久久久久久| 一区二区三区四区在线播放| 樱花草www在线| 亚洲乱码免费伦视频| 国产中文日韩欧美| www.欧美日本韩国| 91精品国产91综合久久蜜臀| 中国一级片在线观看| 精品一区二区三区不卡 | 欧美片第1页综合| 91久久精品久久国产性色也91| 日本www在线观看视频| 欧美精品一卡两卡| 私库av在线播放| 高清视频一区二区| 人人妻人人添人人爽欧美一区| 另类尿喷潮videofree| 欧美怡春院一区二区三区| 天天综合天天综合| 色婷婷亚洲综合| 日韩欧美黄色网址| 久久99精品国产| 男同互操gay射视频在线看| 国产美女亚洲精品7777| 色综合男人天堂| 天堂在线中文网| 色天天综合久久久久综合片| 国产又大又粗又爽的毛片| 精品一区二区三区不卡| 人妻av无码专区| 台湾亚洲精品一区二区tv| 国产成人精品综合| 免费在线你懂的| 亚洲成人激情图| 免费观看日批视频| 亚洲三级小视频| 日本少妇xxxx| 久久精品国产成人一区二区三区| 青青在线免费视频| 色综合久久中文| 成人免费看片视频| 黄色aa久久| 国产一区二区三区精品久久久| 国产精品久久久国产盗摄| 亚洲一区二区av在线| 久久久久久久久久久久| 国产精品白丝av| 国产三区在线视频| 在线电影一区二区| 日本成人黄色免费看| 久久99精品久久久野外观看| 欧美孕妇与黑人孕交| 久草免费在线| 亚洲免费影视第一页| 国产男男gay体育生网站| 狠狠色香婷婷久久亚洲精品| 亚洲天堂网av在线| 久久色在线视频| 一卡二卡三卡四卡五卡| 日韩精品亚洲专区| 男的插女的下面视频| 欧美国产偷国产精品三区| 国产免费高清一区| 国产精品亚洲欧美一级在线 | 久久精品视频2| 亚洲综合在线五月| 99国产精品无码| 26uuu亚洲| 99久久综合网| 精一区二区三区| 精品一卡二卡三卡| 亚洲激情婷婷| 日韩不卡一二区| 日韩精品免费| 日本高清久久一区二区三区| 91亚洲精品视频在线观看| 成人免费看片视频| 国产精品诱惑| 国产精品精品视频| 亚洲第一av| 97在线视频免费| 欧美色图天堂| 九九视频直播综合网| 黄网站视频在线观看| 在线精品高清中文字幕| 欧洲视频在线免费观看| 亚洲激情在线视频| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 欧美一区午夜精品| 国产乱淫av片免费| 欧美人xxxx| 中文字幕第三页| 欧美在线视频日韩| 国产黄色免费视频| 在线一区二区三区四区五区| 亚洲精品男人的天堂| 欧美日韩亚洲激情| 草久视频在线观看| 精品国产91久久久久久老师| 在线免费观看毛片| 精品成人av一区| 六月丁香激情综合| 91久久国产综合久久| 波多野结衣不卡| 欧美伊人久久久久久久久影院| 日韩一级片中文字幕| 91福利在线观看| 久久精品五月天| 欧美四级电影在线观看| 中文字幕在线播放日韩| 欧美日韩国产在线播放网站| 亚洲一区二区三区网站| 91精品婷婷国产综合久久性色| 国产精品爽爽久久| 日韩一区二区三区电影| 亚洲第一视频在线播放| 日韩电影在线观看中文字幕 | 亚洲视频中文字幕在线观看| 欧美日韩一区二区在线观看| 在线免费观看中文字幕| 欧美精品v国产精品v日韩精品| 97久久人国产精品婷婷| 欧美一区二区二区| 午夜视频1000| 一区二区欧美久久| 日韩黄色影院| 久久久久久久影院| 桃色一区二区| 成人免费自拍视频| 国产精品网在线观看| 欧美日韩在线精品一区二区三区| 久久国产电影| 妞干网在线播放| 日韩中文字幕亚洲一区二区va在线| 污色网站在线观看| 丁香婷婷综合网| 色婷婷在线影院| 亚洲欧美精品午睡沙发| 国产成人精品亚洲男人的天堂| 91久久国产综合久久| 99久久精品国产成人一区二区| 亚洲护士老师的毛茸茸最新章节| 北岛玲一区二区三区| 欧美裸身视频免费观看| 制服丝袜专区在线| 亚洲一区中文字幕| 亚洲人和日本人hd| ijzzijzzij亚洲大全| 中文一区在线| av噜噜在线观看| 久久伊人中文字幕| 劲爆欧美第一页| 欧美影视一区在线| 少妇无码一区二区三区| 少妇高潮久久77777| aa视频在线观看| 91视频国产一区| av在线不卡免费观看| 久操网在线观看| 久久99精品久久久久久动态图| 黄色免费视频网站| 亚洲欧美日韩国产综合| 无码人妻精品一区二区三区9厂| 日韩欧美在线一区二区三区| 国产黄在线播放| 69国产精品成人在线播放| 日韩黄色碟片| 日韩黄色影视| 国产精品婷婷| 催眠调教后宫乱淫校园| 国产精品久久久久久久久免费桃花| 中文字幕日韩一级| 日韩精品一区二区三区中文不卡 | 色综合久久久888| 久久三级毛片| 日本在线视频一区| 一区二区三区精品视频在线观看| 美女日批在线观看| 亚洲三级理论片| 一级黄色片在线播放| 亚洲欧美日韩一区二区在线| 2001个疯子在线观看| 国产精品二区三区| 欧美日韩18| 男男受被啪到高潮自述| 国产精品久久久久精k8| 日韩 国产 欧美| 亚洲国产精品99久久| 精品精品导航| 国产高清精品一区二区| 欧美日本一区二区高清播放视频| 午夜视频在线网站| 亚洲欧美在线另类| 国产乱淫a∨片免费视频| 精品国产欧美一区二区三区成人| 69堂免费精品视频在线播放| 欧美一区二区福利| 久久夜色精品| 免费看污片的网站| 在线观看视频一区二区 | 久久久三级国产网站| 在线观看黄网站| 亚洲毛片在线观看.| 成人黄色动漫| 欧美高清性xxxxhdvideosex| 久久久久网站| 丁香花五月婷婷| 欧美三级日本三级少妇99| 欧美一区二区三区在线观看免费| 成人午夜小视频| 你懂的视频一区二区| 国产精品91av| 精品日韩视频在线观看| 欧美捆绑视频| 国产精品极品在线| 91成人免费| 日韩高清一二三区| 欧美日韩免费看| 黄色片视频在线观看| 国产欧美一区二区白浆黑人| 91精品国产自产在线观看永久∴| 特黄特色免费视频| 欧美午夜片在线免费观看| 国产51人人成人人人人爽色哟哟| 国产日韩精品在线观看| 欧美一区二区三区免费看| 老司机午夜免费福利| 色噜噜狠狠一区二区三区果冻| 免费在线午夜视频| 国产日韩欧美一区二区| 日韩电影免费在线| 午夜国产福利一区二区| 亚洲国模精品私拍| 日韩福利影视| 黄色成人在线看| 国产午夜亚洲精品理论片色戒 | 亚洲国产精品va在线看黑人| 激情都市亚洲| 天天干天天操天天干天天操| 成人激情小说网站| 最新中文字幕在线观看视频| 欧美另类暴力丝袜| 欧美禁忌电影网| 国产精品久久久久久久99| 红桃av永久久久| 色综合久久久久综合一本到桃花网| 成人av资源网| 人人超碰91尤物精品国产| 久久精品美女视频| 亚洲香蕉伊综合在人在线视看| 日韩中文一区二区| 日韩av手机版| 亚洲成a人片综合在线| 日韩免费啪啪| 欧美日韩精品一区| 国产成人精品综合在线观看|