精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日本日本19xxxⅹhd乱影响| 99久久99久久精品国产片| 亚洲AV无码国产成人久久| 色婷婷综合久久久中字幕精品久久| 日本一区二区三区四区| 亚洲一区二区三| 午夜精品久久久久久久久久久久久蜜桃 | 成年网站在线播放| 高清免费电影在线观看| 成人av网站免费| 国产精品欧美日韩一区二区| 欧美人妻精品一区二区免费看| 自拍偷拍一区| 日韩欧美不卡在线观看视频| 日本黄网站免费| 欧美aaaaaaa| 国产精品乱码久久久久久| 官网99热精品| 国产精品乱码一区二区| 午夜亚洲福利在线老司机| 操91在线视频| 久久久精品成人| 精品av导航| 欧美一级一区二区| 国产精品乱码久久久久| www欧美xxxx| 亚洲欧美偷拍卡通变态| 日本一区二区三区www| 国产香蕉在线观看| 极品少妇xxxx精品少妇| 国产精品久久婷婷六月丁香| 久久久久久久久久免费视频 | 中文字幕视频在线免费欧美日韩综合在线看 | 综合色婷婷一区二区亚洲欧美国产| 天堂成人在线观看| 国产乱国产乱300精品| 国产精品一区二区三| 天堂在线免费观看视频| 在线不卡视频| 欧美激情影音先锋| 欧美色图亚洲天堂| 国产精品久久久久久久久妇女| 亚洲欧美一区二区三区久久| 在线观看免费视频黄| 年轻的保姆91精品| 欧美日韩国产一区二区三区地区| 日本一本二本在线观看| 色戒汤唯在线| 福利微拍一区二区| 怡红院av亚洲一区二区三区h| 暖暖在线中文免费日本| 一区二区欧美精品| 国产精品av免费观看| 影院在线观看全集免费观看| 亚洲欧美色一区| 国产又粗又硬又长| 岛国中文字幕在线| 亚洲乱码国产乱码精品精的特点 | 视频免费一区| 国产精品日韩精品欧美在线| 小说区图片区图片区另类灬| 波多野结衣一区二区| 中文欧美字幕免费| 宅男噜噜99国产精品观看免费| av大全在线免费看| 国产精品国产三级国产普通话蜜臀| 亚洲欧美丝袜| 麻豆电影在线播放| 一区二区三区欧美亚洲| aa视频在线播放| 蜜桃av在线| 色综合久久久久综合| 国产真实乱子伦| 国产综合色在线观看| 欧美精品高清视频| av在线天堂网| 首页亚洲中字| 亚洲日本中文字幕| 在线观看天堂av| 欧美日韩18| 欧美亚洲国产另类| 伊人久久一区二区| 国产成人av电影在线播放| 国产一区二区三区四区五区在线| 日韩一区二区三区在线观看视频| 久久亚洲精华国产精华液| 亚洲精品一卡二卡三卡四卡| 中文字幕在线观看网站| 欧美日韩午夜视频在线观看| 国产又大又黄又粗又爽| 99国产精品免费网站| 亚洲美女av电影| 三级黄色在线观看| 亚洲欧洲一区| 国产中文字幕91| 欧美视频一二区| 国产精品色哟哟网站| 成年女人18级毛片毛片免费| 欧美成人ⅴideosxxxxx| 欧美一区二区三区人| 超碰97人人干| 91精品国产调教在线观看| 77777少妇光屁股久久一区| 中文字幕在线观看精品| 成人h精品动漫一区二区三区| 台湾成人av| www视频在线观看| 欧美精品1区2区| 日韩av在线看免费观看| 中文字幕一区二区av| 国产精品高潮粉嫩av| 国产人妻精品一区二区三| 久久亚洲一级片| 青青草国产免费| 高清一区二区三区av| 亚洲精品一区久久久久久| 欧美成人aaa片一区国产精品| 日韩电影在线一区二区三区| 国产精品嫩草在线观看| 久久黄色美女电影| 欧美在线视频不卡| 一区二区免费在线观看视频| 亚洲深深色噜噜狠狠爱网站| 国产精品88a∨| 亚洲欧美另类综合| 亚洲精品伦理在线| 日本77777| 日本精品黄色| 国产成人一区二区在线| 天天综合天天色| 亚洲第一成人在线| 午夜性福利视频| 亚洲精品tv久久久久久久久久| 国产精品69精品一区二区三区| 深爱激情五月婷婷| 亚洲成人综合视频| 黄色av电影网站| 亚洲欧美综合国产精品一区| 91精品国产自产在线老师啪| 国产视频在线看| 色哟哟一区二区在线观看| 97人妻天天摸天天爽天天| 黄色精品免费| 国产伦一区二区三区色一情| 黄色美女视频在线观看| 日韩免费观看高清完整版 | 一本加勒比波多野结衣| 国产精品vip| 99精品国产高清一区二区| 爆操欧美美女| 日韩视频一区二区在线观看| 草视频在线观看| 国产精品 欧美精品| 91精品一区二区三区四区| 欧洲一区在线| 久久久久久久成人| 天天摸天天干天天操| 图片区小说区国产精品视频| av鲁丝一区鲁丝二区鲁丝三区| 日韩一级欧洲| 欧美精品一区二区三区在线看午夜| 欧美极品影院| 日韩最新在线视频| 99久久精品免费看国产交换| 亚洲综合一二三区| 中文字幕三级电影| 国产欧美丝祙| 日韩欧美三级一区二区| 欧美亚洲人成在线| 欧美精品中文字幕一区| 欧美 中文字幕| 欧美午夜精品在线| 中国1级黄色片| 国产精品一色哟哟哟| 黄色一级片在线看| 精品在线手机视频| 成人妇女免费播放久久久| 99福利在线| 亚洲美女在线看| 在线免费观看一区二区| 一区二区三区在线高清| 亚洲国产综合视频| 欧美aaaaa成人免费观看视频| 亚洲成年人专区| 精品国产一区二区三区成人影院| 国产成+人+综合+亚洲欧洲| 人人干在线视频| 亚洲激情国产精品| 一级特黄aa大片| 亚洲成人中文在线| 青青青视频在线免费观看| 国产mv日韩mv欧美| www.色偷偷.com| 激情文学一区| 神马影院一区二区| 国产精东传媒成人av电影| 国产精品久久久久91| 亚洲男同gay网站| 亚洲图片在区色| www.成人在线观看| 在线观看欧美日本| 国产无套粉嫩白浆内谢| 日本一二三四高清不卡| 无码人妻丰满熟妇区毛片蜜桃精品| 久久不射网站| 屁屁影院ccyy国产第一页| 精品高清在线| 国产视频不卡| 激情不卡一区二区三区视频在线| 欧美在线一区二区三区四| 日韩激情美女| 色婷婷av一区二区三区在线观看| 日本高清视频免费观看| 51久久夜色精品国产麻豆| 青青青国产在线 | 久久精品色综合| 91在线视频导航| 九九九精品视频| 国产99久久精品一区二区 夜夜躁日日躁| 中文字幕中文字幕在线十八区 | 日韩一级成人av| 中文在线观看免费高清| 午夜精品成人在线视频| 欧美日韩一级大片| 一区精品在线播放| 老司机福利在线观看| 久久精品夜夜夜夜久久| 黑丝av在线播放| 成人高清免费观看| 特级特黄刘亦菲aaa级| 国产一区二区看久久| 亚洲免费999| 久久国产人妖系列| 在线观看的毛片| 欧美aⅴ一区二区三区视频| 日韩免费高清在线| 天堂成人国产精品一区| 男人天堂网视频| 亚洲在线日韩| 国内外成人激情视频| 亚洲理伦在线| 精品国产一区三区| 在线视频精品| 怡红院av亚洲一区二区三区h| 精品91视频| 日韩精品在线中文字幕| 欧美色图首页| 免费一级淫片aaa片毛片a级| 欧美精品啪啪| 日韩亚洲欧美视频| 亚洲精品影视| 各处沟厕大尺度偷拍女厕嘘嘘| 中文在线不卡| 亚洲自偷自拍熟女另类| 老**午夜毛片一区二区三区| 99久久国产宗和精品1上映 | 91人妻一区二区三区| 国产精品性做久久久久久| avtt中文字幕| 2022国产精品视频| 人人妻人人澡人人爽| 国产精品家庭影院| 日韩激情综合网| 夜夜嗨av一区二区三区网页| 中日韩精品视频在线观看| 欧美日韩国产综合新一区| 日韩乱码在线观看| 欧美性高跟鞋xxxxhd| jizz国产在线| 91精品国产91久久久久久一区二区 | 亚洲午夜精品久久久久久性色 | 精品视频免费在线观看| 亚洲精品成人a8198a| 在线国产一区二区| www..com日韩| 老司机免费视频久久| av亚洲天堂网| a级精品国产片在线观看| 性欧美一区二区| 亚洲欧美另类久久久精品2019| 久久久久97国产| 欧美日韩综合视频| 一级黄色片免费看| 欧美精品一区二区三区很污很色的| 天天干,夜夜爽| 久久精品在线视频| 黄在线观看免费网站ktv| 国产精品久久久久9999| 亚洲高清在线一区| 免费亚洲精品视频| 亚洲精品久久久| 人妻少妇被粗大爽9797pw| 精品一区二区三区av| 国产一级免费片| 国产精品久久久一本精品| 香蕉视频一区二区| 欧美日韩视频不卡| 日本免费网站在线观看| 日韩中文视频免费在线观看| 天堂а√在线最新版中文在线| 国产日韩精品综合网站| 牛牛视频精品一区二区不卡| 在线不卡日本| 久久狠狠一本精品综合网| 最好看的中文字幕| 欧美高清在线一区二区| 奇米影视第四色777| 欧美精品久久99久久在免费线 | 欧美亚洲一级片| 爱啪视频在线观看视频免费| 国产成人精品在线| 超碰在线成人| 中文字幕成人一区| 三级不卡在线观看| 国产大学生视频| 国产精品福利一区二区三区| 少妇久久久久久久| 亚洲精品美女在线| 日韩精品卡一| 91久久偷偷做嫩草影院| 欧美电影免费| 午夜dv内射一区二区| 91在线免费视频观看| 九九热国产精品视频| 5月丁香婷婷综合| 色老头视频在线观看| 国产精品成人aaaaa网站| 任我爽精品视频在线播放| 欧美激情亚洲天堂| 国产精品一区二区91| 在线免费看视频| 欧美视频在线观看一区二区| 国产三级在线免费| 啪一啪鲁一鲁2019在线视频| 欧美天堂影院| 欧美日本视频在线观看| 99久久精品国产网站| 国产真人真事毛片| 精品国产乱码久久久久久免费 | 欧美极品少妇xxxxⅹ免费视频| av一级久久| 三级网在线观看| 国产精品正在播放| 九九九久久久久| 精品国产伦一区二区三区观看方式 | 26uuu亚洲综合色| 欧美另类一区二区| 亚洲精品中文字幕女同| 怡红院成人在线| 日韩激情视频| 经典三级在线一区| 最新一区二区三区| 精品日韩在线一区| 多野结衣av一区| 蜜桃成人在线| 日本在线不卡视频一二三区| 大吊一区二区三区| 欧美一区二区视频在线观看2022| huan性巨大欧美| 国产精品精品软件视频| 国产一区导航| 在线免费观看视频| 欧美一区二区成人6969| 色老头在线观看| 精品欧美日韩| 日本不卡中文字幕| 欧美激情一区二区视频| 亚洲国产第一页| **在线精品| 伊人色综合影院| 国产.欧美.日韩| 久久99国产综合精品免费| 永久555www成人免费| 久久99成人| 丰满人妻中伦妇伦精品app| 中文字幕欧美三区| 99热这里只有精品1| 97在线视频免费观看| 精品国产aⅴ| 风韵丰满熟妇啪啪区老熟熟女| 精品久久久久久国产91| 国产毛片在线| 99精品在线直播| 日欧美一区二区| 麻豆亚洲av熟女国产一区二| 亚洲精品自拍第一页| 成人黄色91| 欧美日韩性生活片| 国产精品白丝在线| 熟妇高潮一区二区高潮| 国产精品色婷婷视频| 亚洲网站视频| 正在播放国产对白害羞| 亚洲国产古装精品网站| 91精品国产一区二区在线观看| 久久久性生活视频| 成人欧美一区二区三区视频网页| 国产又爽又黄网站亚洲视频123| 国产精品视频男人的天堂| 亚洲理论在线|