-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
252 lines (218 loc) · 40.2 KB
/
index.html
File metadata and controls
252 lines (218 loc) · 40.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
<!DOCTYPE html><html lang="zh_CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>My Blog - 我们把世界看错,反说它欺骗了我们。</title><meta name="author" content="YeSho"><meta name="copyright" content="YeSho"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="ffffff"><meta name="description" content="C++,操作系统,算法">
<meta property="og:type" content="website">
<meta property="og:title" content="My Blog">
<meta property="og:url" content="https://www.yesho.top/index.html">
<meta property="og:site_name" content="My Blog">
<meta property="og:description" content="C++,操作系统,算法">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://avatars.githubusercontent.com/u/101156528?v=4">
<meta property="article:author" content="YeSho">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://avatars.githubusercontent.com/u/101156528?v=4"><link rel="shortcut icon" href="/favicon.ico"><link rel="canonical" href="https://www.yesho.top/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css?v=4.13.0"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.1/css/all.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/node-snackbar@0.1.16/dist/snackbar.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0.33/dist/fancybox/fancybox.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: {"path":"/search.xml","preload":true,"top_n_per_article":1,"unescape":false,"languages":{"hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found"}},
translate: {"defaultEncoding":2,"translateDelay":0,"msgToTraditionalChinese":"繁","msgToSimplifiedChinese":"簡"},
noticeOutdate: undefined,
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
copy: {
success: 'Copy Successful',
error: 'Copy Error',
noSupport: 'Browser Not Supported'
},
relativeDate: {
homepage: true,
post: false
},
runtime: '',
dateSuffix: {
just: 'Just now',
min: 'minutes ago',
hour: 'hours ago',
day: 'days ago',
month: 'months ago'
},
copyright: undefined,
lightbox: 'fancybox',
Snackbar: {"chs_to_cht":"You have switched to Traditional Chinese","cht_to_chs":"You have switched to Simplified Chinese","day_to_night":"You have switched to Dark Mode","night_to_day":"You have switched to Light Mode","bgLight":"#49b1f5","bgDark":"#1f1f1f","position":"top-right"},
infinitegrid: {
js: 'https://cdn.jsdelivr.net/npm/@egjs/infinitegrid@4.11.1/dist/infinitegrid.min.js',
buttonText: 'Load More'
},
isPhotoFigcaption: false,
islazyload: true,
isAnchor: false,
percent: {
toc: true,
rightside: false,
},
autoDarkmode: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: 'My Blog',
isPost: false,
isHome: true,
isHighlightShrink: false,
isToc: false,
postUpdate: '2024-12-16 19:24:03'
}</script><script>(win=>{
win.saveToLocal = {
set: (key, value, ttl) => {
if (ttl === 0) return
const now = Date.now()
const expiry = now + ttl * 86400000
const item = {
value,
expiry
}
localStorage.setItem(key, JSON.stringify(item))
},
get: key => {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = Date.now()
if (now > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = (url, attr = {}) => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
Object.keys(attr).forEach(key => {
script.setAttribute(key, attr[key])
})
document.head.appendChild(script)
})
win.getCSS = (url, id = false) => new Promise((resolve, reject) => {
const link = document.createElement('link')
link.rel = 'stylesheet'
link.href = url
if (id) link.id = id
link.onerror = reject
link.onload = link.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
link.onload = link.onreadystatechange = null
resolve()
}
document.head.appendChild(link)
})
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
const detectApple = () => {
if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
})(window)</script><link rel="stylesheet" href="/css/iconfont.css"><meta name="generator" content="Hexo 6.3.0"></head><body><div id="web_bg"></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://avatars.githubusercontent.com/u/101156528?v=4" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">Articles</div><div class="length-num">7</div></a><a href="/tags/"><div class="headline">Tags</div><div class="length-num">3</div></a><a href="/categories/"><div class="headline">Categories</div><div class="length-num">2</div></a></div><hr class="custom-hr"/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 归档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 列表</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 电影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="full_page fixed" id="page-header"><nav id="nav"><span id="blog-info"><a href="/" title="My Blog"><span class="site-name">My Blog</span></a></span><div id="menus"><div id="search-button"><a class="site-page social-icon search" href="javascript:void(0);"><i class="fas fa-search fa-fw"></i><span> Search</span></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 归档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 列表</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 电影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div><div id="toggle-menu"><a class="site-page" href="javascript:void(0);"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="site-info"><h1 id="site-title">My Blog</h1><div id="site-subtitle"><span id="subtitle"></span></div><div id="site_social_icons"><a class="social-icon" href="https://github.com/YeSho-cpp" target="_blank" title="Github"><i class="fab fa-github" style="color: #24292e;"></i></a><a class="social-icon" href="https://space.bilibili.com/38716159" target="_blank" title="B站"><i class="iconfont icon-querenbantubiao_Bzhan" style="color: faa-tada;"></i></a><a class="social-icon" href="https://www.zhihu.com/people/yong-shi-huai-huan-ge-can-lan-35" target="_blank" title="知乎"><i class="iconfont icon-shejiaotubiao-10" style="color: faa-tada;"></i></a><a class="social-icon" href="https://leetcode.cn/u/yong-shi-huai-huan-ge-can-lan/" target="_blank" title="力扣"><i class="iconfont icon-likou" style="color: faa-tada;"></i></a></div></div><div id="scroll-down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout" id="content-inner"><div class="recent-posts" id="recent-posts"><div class="recent-post-item"><div class="post_cover left"><a href="/2024/05/13/asio%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B(%E4%B8%80)/" title="asio网络编程(一)"><img class="post-bg" src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192300.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="asio网络编程(一)"></a></div><div class="recent-post-info"><a class="article-title" href="/2024/05/13/asio%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B(%E4%B8%80)/" title="asio网络编程(一)">asio网络编程(一)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">Created</span><time class="post-meta-date-created" datetime="2024-05-13T12:25:03.446Z" title="Created 2024-05-13 20:25:03">2024-05-13</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">Updated</span><time class="post-meta-date-updated" datetime="2024-05-13T12:25:03.446Z" title="Updated 2024-05-13 20:25:03">2024-05-13</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/">网络编程</a></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/">网络编程</a></span></div><div class="content">asio之socket的创建和连接终端节点的创建
所谓终端节点就是用来通信的端对端的节点,可以通过ip地址和端口构造,其的节点可以连接这个终端节点做通信。
如果我们是客户端,我们可以通过对端的ip和端口构造一个endpoint,用这个endpoint和其通信。
123456789101112131415161718192021int client_end_point() { // 步骤 1. 假设客户端应用程序已经获得了 IP 地址和协议端口号。 std::string raw_ip_address = "127.0.0.1"; unsigned short port_num = 3333; // 用于存储在解析原始 IP 地址时发生的错误信息。 boost::system::error_code ec; // 步骤 2. 使用 IP 协议版本无关的地址表示。 asio::ip::address ip_address = asio::ip::address::from_string(raw_ ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%BA%94)/" title="一起写webserver 项目(五)"><img class="post-bg" src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192124.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="一起写webserver 项目(五)"></a></div><div class="recent-post-info"><a class="article-title" href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%BA%94)/" title="一起写webserver 项目(五)">一起写webserver 项目(五)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">Created</span><time class="post-meta-date-created" datetime="2024-04-30T13:26:36.506Z" title="Created 2024-04-30 21:26:36">2024-04-30</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">Updated</span><time class="post-meta-date-updated" datetime="2024-04-30T13:51:51.027Z" title="Updated 2024-04-30 21:51:51">2024-04-30</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E4%B8%80%E8%B5%B7%E5%81%9A%E9%A1%B9%E7%9B%AE/">一起做项目</a></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E9%A1%B9%E7%9B%AE/">项目</a></span></div><div class="content">webserver类的封装参数和方法123456789101112131415161718192021222324252627282930//基础int m_close_log; // 是否关闭日志int m_is_async; // 日志是否异步char *m_root; // 我们之前服务器上用于存放网页文件的根目录的路径http_conn *users; // 对应所有的客户端int m_listen_fd;int m_TRIGMode;int m_LISTENTrigmode;int m_CONNTrigmode;int m_opt_linger;int m_epoll_fd;int m_pipefd[2];epoll_event events[MAX_EVENT_NUMBER];// 数据库相关connection_pool *m_sql_pool;int m_port;string m_user;string m_password;string m_dbName;int m_sql_num;// 线程池相关thread_pool<http_conn> *m_po ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E5%9B%9B)/" title="一起写webserver 项目(四)"><img class="post-bg" src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216191558.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="一起写webserver 项目(四)"></a></div><div class="recent-post-info"><a class="article-title" href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E5%9B%9B)/" title="一起写webserver 项目(四)">一起写webserver 项目(四)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">Created</span><time class="post-meta-date-created" datetime="2024-04-30T12:39:33.674Z" title="Created 2024-04-30 20:39:33">2024-04-30</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">Updated</span><time class="post-meta-date-updated" datetime="2024-06-05T07:54:02.341Z" title="Updated 2024-06-05 15:54:02">2024-06-05</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E4%B8%80%E8%B5%B7%E5%81%9A%E9%A1%B9%E7%9B%AE/">一起做项目</a></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E9%A1%B9%E7%9B%AE/">项目</a></span></div><div class="content">http连接的封装先前我们写的线程,数据库池或者底层的小工具如locker锁等东西是地基,是骨架,那么http解析部分就是主体,是血肉。这是这个项目最关键的部分。
下面是一张简易的框架图,首先说明一下这个WebServer的本质,WebServer的本质上是⼀个⾼性能⽹络框架,它提供了⼀个单服务端(当然也可以扩展为多服务端)与多客户端的⾼效连接框架,但是客户端与服务端连接上以后具体应该做些什么(也就是有哪些业务),这就可以由我们⾃由发挥了,这就是 WebServer 的功能扩展。⽬前⼤多数的WebServer都将从服务端获取MIME作为主要功能。
由于变量和参数过多,先不介绍初始化了,先从设计讲起。
http_conn的设计其中大部分设计都是参考了《Linux高性能服务器编程》
固定的一些方法和变量定义http响应的一些状态信息
123456789const char *ok_200_title = "OK";const char *error_400_title = "Bad Request";const char *error_40 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%B8%89)/" title="一起写webserver 项目(三)"><img class="post-bg" src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192235.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="一起写webserver 项目(三)"></a></div><div class="recent-post-info"><a class="article-title" href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%B8%89)/" title="一起写webserver 项目(三)">一起写webserver 项目(三)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">Created</span><time class="post-meta-date-created" datetime="2024-04-30T03:52:00.405Z" title="Created 2024-04-30 11:52:00">2024-04-30</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">Updated</span><time class="post-meta-date-updated" datetime="2024-06-05T07:47:49.129Z" title="Updated 2024-06-05 15:47:49">2024-06-05</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E4%B8%80%E8%B5%B7%E5%81%9A%E9%A1%B9%E7%9B%AE/">一起做项目</a></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E9%A1%B9%E7%9B%AE/">项目</a></span></div><div class="content">数据库连接池的封装什么是池
池的概念
“浪费”服务器的硬件资源,以换取其运行效率。
池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,这称为静态资源分配。
直接从池中取得所需资源比动态分配资源的速度要快得多,因为分配系统资源的系统调用都是很耗时的
为什么需要数据库连接池?
每个逻辑单元可能都需要频繁地访问本地的某个数据库。
连接池是服务器预先和数据库程序建立的一组连接的集合。当某个逻辑单元需要访问数据库时,它可以直接从连接池中取得一个连接的实体并使用之。待完成数据库的访问之后,逻辑单元再将该连接返还给连接池
单例模式单例模式的好处就不再赘述
1234567891011class connection_pool{public: static connection_pool* Getinstance() { static connection_pool connPool; return &connPool; } private: connection_pool(); ~ ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2024/04/29/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%BA%8C)/" title="一起写webserver 项目(二)"><img class="post-bg" src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192001.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="一起写webserver 项目(二)"></a></div><div class="recent-post-info"><a class="article-title" href="/2024/04/29/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%BA%8C)/" title="一起写webserver 项目(二)">一起写webserver 项目(二)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">Created</span><time class="post-meta-date-created" datetime="2024-04-29T13:06:40.942Z" title="Created 2024-04-29 21:06:40">2024-04-29</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">Updated</span><time class="post-meta-date-updated" datetime="2024-04-29T14:18:40.487Z" title="Updated 2024-04-29 22:18:40">2024-04-29</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E4%B8%80%E8%B5%B7%E5%81%9A%E9%A1%B9%E7%9B%AE/">一起做项目</a></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E9%A1%B9%E7%9B%AE/">项目</a></span></div><div class="content">日志和同步原语的封装
写一个项目,一开始不知道从哪里开始,我的经验是大致看一下主函数,了解一下有哪些模块?然后从简单的模块开始逐个看,看完了记住流程思路,我们就可以复现,然后这样虽然阅读起来比整体一行一行看简单,但是各个模块之间相互穿插,单个模块看,理解不了它们之间的关系,所以建议所有模块看完后,再重新看一遍,把整个流程串通,这样整个项目就非常清晰了。
其实我们也可以看作者的Readme的整体框架图
Locker类这里的locker的封装是参考《Linux高性能服务器编程》,用了RAII的思想,即将资源的获取和释放绑定在对象的生命周期中。比较简单就不用怎么叙述了,其实这里完全可以c++的同步原语语法,感兴趣的读者可以自行尝试
信号量
1234567891011121314151617181920212223242526class sem{public: sem(){ if(sem_init(&m_sem,0,0)!=0){ throw std::exception(); } } expli ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2024/04/29/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%B8%80)/" title="一起写webserver 项目(一)"><img class="post-bg" src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192235.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="一起写webserver 项目(一)"></a></div><div class="recent-post-info"><a class="article-title" href="/2024/04/29/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%B8%80)/" title="一起写webserver 项目(一)">一起写webserver 项目(一)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">Created</span><time class="post-meta-date-created" datetime="2024-04-29T12:55:53.245Z" title="Created 2024-04-29 20:55:53">2024-04-29</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">Updated</span><time class="post-meta-date-updated" datetime="2024-04-29T14:18:34.661Z" title="Updated 2024-04-29 22:18:34">2024-04-29</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E4%B8%80%E8%B5%B7%E5%81%9A%E9%A1%B9%E7%9B%AE/">一起做项目</a></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E9%A1%B9%E7%9B%AE/">项目</a></span></div><div class="content">在做整个项目之前建议看完《Linux高性能服务器编程》-中国-游双,这个项目会用到里面的很多知识。
webserver 环境配置安装Linux环境webserver作为c++的一个经典项目,虽然烂大街,但是对于网络编程和系统编程非常重要,几乎等同于spring于java,可以不用,但基本要会。
选择一个github的项目 GitHub - qinguoyi/TinyWebServer: :fire: Linux下C++轻量级WebServer服务器
我用的是wsl2子系统,发行版是Debian系统,gcc、g++默认都已经安装了,推荐大家用云服务器,这样项目运行访问时就不必是回环地址,这样更贴合生产环境。
安装MYSQL使用apt包管理器:
12sudo apt-get updatesudo apt-get install mysql-server
其他发行版也同理
运行项目然后就是克隆项目运行
12git init ## 将本地仓库初始化git clone <url> ## 将需要的项⽬从 github 上克隆下来,url为项⽬地址
测试前确认已安装MySQL ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2024/03/20/hello-world/" title="hexo 教程"><img class="post-bg" src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192235.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="hexo 教程"></a></div><div class="recent-post-info"><a class="article-title" href="/2024/03/20/hello-world/" title="hexo 教程">hexo 教程</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">Created</span><time class="post-meta-date-created" datetime="2024-03-20T15:27:40.931Z" title="Created 2024-03-20 23:27:40">2024-03-20</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">Updated</span><time class="post-meta-date-updated" datetime="2024-04-29T14:18:13.543Z" title="Updated 2024-04-29 22:18:13">2024-04-29</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E6%95%99%E7%A8%8B/">教程</a></span></div><div class="content">Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
123456#include <iostream>using namespace std;int m ...</div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://avatars.githubusercontent.com/u/101156528?v=4" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">YeSho</div><div class="author-info__description">C++,操作系统,算法</div></div><div class="card-info-data site-data is-center"><a href="/archives/"><div class="headline">Articles</div><div class="length-num">7</div></a><a href="/tags/"><div class="headline">Tags</div><div class="length-num">3</div></a><a href="/categories/"><div class="headline">Categories</div><div class="length-num">2</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/YeSho-cpp"><i class="fab fa-github"></i><span>关注我</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/YeSho-cpp" target="_blank" title="Github"><i class="fab fa-github" style="color: #24292e;"></i></a><a class="social-icon" href="https://space.bilibili.com/38716159" target="_blank" title="B站"><i class="iconfont icon-querenbantubiao_Bzhan" style="color: faa-tada;"></i></a><a class="social-icon" href="https://www.zhihu.com/people/yong-shi-huai-huan-ge-can-lan-35" target="_blank" title="知乎"><i class="iconfont icon-shejiaotubiao-10" style="color: faa-tada;"></i></a><a class="social-icon" href="https://leetcode.cn/u/yong-shi-huai-huan-ge-can-lan/" target="_blank" title="力扣"><i class="iconfont icon-likou" style="color: faa-tada;"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>Announcement</span></div><div class="announcement_content">储备的流逝</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>Recent Post</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2024/05/13/asio%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B(%E4%B8%80)/" title="asio网络编程(一)"><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192300.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="asio网络编程(一)"/></a><div class="content"><a class="title" href="/2024/05/13/asio%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B(%E4%B8%80)/" title="asio网络编程(一)">asio网络编程(一)</a><time datetime="2024-05-13T12:25:03.446Z" title="Created 2024-05-13 20:25:03">2024-05-13</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%BA%94)/" title="一起写webserver 项目(五)"><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192124.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="一起写webserver 项目(五)"/></a><div class="content"><a class="title" href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%BA%94)/" title="一起写webserver 项目(五)">一起写webserver 项目(五)</a><time datetime="2024-04-30T13:26:36.506Z" title="Created 2024-04-30 21:26:36">2024-04-30</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E5%9B%9B)/" title="一起写webserver 项目(四)"><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216191558.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="一起写webserver 项目(四)"/></a><div class="content"><a class="title" href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E5%9B%9B)/" title="一起写webserver 项目(四)">一起写webserver 项目(四)</a><time datetime="2024-04-30T12:39:33.674Z" title="Created 2024-04-30 20:39:33">2024-04-30</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%B8%89)/" title="一起写webserver 项目(三)"><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192235.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="一起写webserver 项目(三)"/></a><div class="content"><a class="title" href="/2024/04/30/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%B8%89)/" title="一起写webserver 项目(三)">一起写webserver 项目(三)</a><time datetime="2024-04-30T03:52:00.405Z" title="Created 2024-04-30 11:52:00">2024-04-30</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2024/04/29/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%BA%8C)/" title="一起写webserver 项目(二)"><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="http://yesho-web.oss-cn-hangzhou.aliyuncs.com/img/20241216192001.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="一起写webserver 项目(二)"/></a><div class="content"><a class="title" href="/2024/04/29/%E4%B8%80%E8%B5%B7%E5%86%99webserver%20%E9%A1%B9%E7%9B%AE(%E4%BA%8C)/" title="一起写webserver 项目(二)">一起写webserver 项目(二)</a><time datetime="2024-04-29T13:06:40.942Z" title="Created 2024-04-29 21:06:40">2024-04-29</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline">
<i class="fas fa-folder-open"></i>
<span>Categories</span>
</div>
<ul class="card-category-list" id="aside-cat-list">
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E4%B8%80%E8%B5%B7%E5%81%9A%E9%A1%B9%E7%9B%AE/"><span class="card-category-list-name">一起做项目</span><span class="card-category-list-count">5</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/"><span class="card-category-list-name">网络编程</span><span class="card-category-list-count">1</span></a></li>
</ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>Tags</span></div><div class="card-tag-cloud"><a href="/tags/%E6%95%99%E7%A8%8B/" style="font-size: 1.1em; color: #999">教程</a> <a href="/tags/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/" style="font-size: 1.1em; color: #999">网络编程</a> <a href="/tags/%E9%A1%B9%E7%9B%AE/" style="font-size: 1.5em; color: #99a9bf">项目</a></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>Archives</span></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/05/"><span class="card-archive-list-date">五月 2024</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/04/"><span class="card-archive-list-date">四月 2024</span><span class="card-archive-list-count">5</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/03/"><span class="card-archive-list-date">三月 2024</span><span class="card-archive-list-count">1</span></a></li></ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>Info</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">Article :</div><div class="item-count">7</div></div><div class="webinfo-item"><div class="item-name">Total Count :</div><div class="item-count">21.5k</div></div><div class="webinfo-item"><div class="item-name">UV :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">PV :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">Last Update :</div><div class="item-count" id="last-push-date" data-lastPushDate="2024-12-16T11:24:03.591Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2022 - 2024 By YeSho</div><div class="framework-info"><span>Framework </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>Theme </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="translateLink" type="button" title="Toggle Between Traditional Chinese And Simplified Chinese">簡</button><button id="hide-aside-btn" type="button" title="Toggle between Single-column and Double-column"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="Setting"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="Back To Top"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js?v=4.13.0"></script><script src="/js/main.js?v=4.13.0"></script><script src="/js/tw_cn.js?v=4.13.0"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0.33/dist/fancybox/fancybox.umd.min.js"></script><script src="https://cdn.jsdelivr.net/npm/instant.page@5.2.0/instantpage.min.js" type="module"></script><script src="https://cdn.jsdelivr.net/npm/vanilla-lazyload@17.8.8/dist/lazyload.iife.min.js"></script><script src="https://cdn.jsdelivr.net/npm/node-snackbar@0.1.16/dist/snackbar.min.js"></script><script>function panguFn () {
if (typeof pangu === 'object') pangu.autoSpacingPage()
else {
getScript('https://cdn.jsdelivr.net/npm/pangu@4.0.7/dist/browser/pangu.min.js')
.then(() => {
pangu.autoSpacingPage()
})
}
}
function panguInit () {
if (false){
GLOBAL_CONFIG_SITE.isPost && panguFn()
} else {
panguFn()
}
}
document.addEventListener('DOMContentLoaded', panguInit)</script><div class="js-pjax"><script>window.typedJSFn = {
init: (str) => {
window.typed = new Typed('#subtitle', Object.assign({
strings: str,
startDelay: 300,
typeSpeed: 150,
loop: true,
backSpeed: 50,
}, null))
},
run: (subtitleType) => {
if (true) {
if (typeof Typed === 'function') {
subtitleType()
} else {
getScript('https://cdn.jsdelivr.net/npm/typed.js@2.1.0/dist/typed.umd.min.js').then(subtitleType)
}
} else {
subtitleType()
}
}
}
</script><script>function subtitleType () {
if (true) {
typedJSFn.init(["我们把世界看错,反说它欺骗了我们。"])
} else {
document.getElementById("subtitle").textContent = "我们把世界看错,反说它欺骗了我们。"
}
}
typedJSFn.run(subtitleType)</script></div><script id="canvas_nest" defer="defer" color="0,0,255" opacity="0.7" zIndex="-1" count="30" mobile="false" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1.1.3/dist/canvas-nest.min.js"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.css" media="print" onload="this.media='all'"><script src="https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.js"></script><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1.1.3/metingjs/dist/Meting.min.js"></script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><div id="local-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">Search</span><span id="loading-status"></span><button class="search-close-button"><i class="fas fa-times"></i></button></nav><div class="is-center" id="loading-database"><i class="fas fa-spinner fa-pulse"></i><span> Loading the Database</span></div><div class="search-wrap"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="Search for Posts" type="text"/></div></div><hr/><div id="local-search-results"></div><div id="local-search-stats-wrap"></div></div></div><div id="search-mask"></div><script src="/js/search/local-search.js?v=4.13.0"></script></div></div></body></html>