-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
225 lines (120 loc) · 96.8 KB
/
Copy pathatom.xml
File metadata and controls
225 lines (120 loc) · 96.8 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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>CGinMax的博客</title>
<subtitle>技术宅的私密时间</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://cginmax.github.io/"/>
<updated>2019-03-02T11:27:47.234Z</updated>
<id>http://cginmax.github.io/</id>
<author>
<name>CGinMax Cooper</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Qt字符串</title>
<link href="http://cginmax.github.io/2019/3/2/QtString/"/>
<id>http://cginmax.github.io/2019/3/2/QtString/</id>
<published>2019-03-02T11:27:47.000Z</published>
<updated>2019-03-02T11:27:47.234Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h1 id="Qt-String-类内容"><a href="#Qt-String-类内容" class="headerlink" title="Qt String 类内容"></a>Qt String 类内容</h1><h2 id="字符串和数值之间的转换"><a href="#字符串和数值之间的转换" class="headerlink" title="字符串和数值之间的转换"></a>字符串和数值之间的转换</h2><h3 id="QString字符串转换成数值"><a href="#QString字符串转换成数值" class="headerlink" title="QString字符串转换成数值"></a>QString字符串转换成数值</h3><p>对于基本的数值,字符串都能进行转换<br></p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">toInt</span><span class="params">(<span class="keyword">bool</span> *ok = Q_NULLPTR, <span class="keyword">int</span> base = <span class="number">10</span>)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="title">toLong</span><span class="params">(<span class="keyword">bool</span> *ok = Q_NULLPTR, <span class="keyword">int</span> base = <span class="number">10</span>)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"><span class="keyword">short</span> <span class="title">toShort</span><span class="params">(<span class="keyword">bool</span> *ok = Q_NULLPTR, <span class="keyword">int</span> base = <span class="number">10</span>)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function">uint <span class="title">toUInt</span><span class="params">(<span class="keyword">bool</span> *ok = Q_NULLPTR, <span class="keyword">int</span> base = <span class="number">10</span>)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function">ulong <span class="title">toULong</span><span class="params">(<span class="keyword">bool</span> *ok = Q_NULLPTR, <span class="keyword">int</span> base = <span class="number">10</span>)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">toDouble</span><span class="params">(<span class="keyword">bool</span> *ok = Q_NULLPTR)</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"><span class="keyword">float</span> <span class="title">toFloat</span><span class="params">(<span class="keyword">bool</span> *ok = Q_NULLPTR)</span> <span class="keyword">const</span></span></span><br></pre></td></tr></tbody></table></figure><p></p><p>当转换成功,ok置为true,否则为false,base是进制大小,默认是十进制。</p><h3 id="数值转换成字符串"><a href="#数值转换成字符串" class="headerlink" title="数值转换成字符串"></a>数值转换成字符串</h3><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">QString::number(<span class="keyword">int</span> n, <span class="keyword">int</span> base = <span class="number">10</span>);</span><br><span class="line">QString::number(uint n, <span class="keyword">int</span> base = <span class="number">10</span>);</span><br><span class="line">QString::number(ulong n, <span class="keyword">int</span> base = <span class="number">10</span>);</span><br><span class="line">QString::number(qlonglong n, <span class="keyword">int</span> base = <span class="number">10</span>);</span><br><span class="line">QString::number(qulonglong n, <span class="keyword">int</span> base = <span class="number">10</span>);</span><br><span class="line">QString::number(<span class="keyword">double</span> n, <span class="keyword">char</span> format = <span class="string">'g'</span>, <span class="keyword">int</span> precision = <span class="number">6</span>);</span><br><span class="line">QString::asprintf(<span class="keyword">const</span> <span class="keyword">char</span> *cformat, ...);</span><br><span class="line">str.setNum(...);<span class="comment">//与QString::number相同</span></span><br><span class="line">str.<span class="built_in">sprintf</span>(...);<span class="comment">//与QString::asprintf相同</span></span><br></pre></td></tr></tbody></table></figure><h2 id="字符串常用方法"><a href="#字符串常用方法" class="headerlink" title="字符串常用方法"></a>字符串常用方法</h2><ul><li><p><strong>append()、prepend()</strong><br>append()在字符串后插,prepend()在字符串前插。</p></li><li><p><strong>toUpper()、toLower()</strong><br>toUpper()小写转换成大写,toLower()转成小写。</p></li><li><p><strong>count()、size()、length()</strong><br>三个都是获取字符串的长度,一个汉字算一个字节</p></li><li><p><strong>trimmed()、simplified()</strong><br>trimmed()去掉整个字符串前后的空格,simplified()去掉前后、中间的空格。</p></li><li><p><strong>indexOf()&lastIndexOf()</strong><br>indexOf(str,from)是在自身字符串内查找str,从from开始查找,返回最先出现的位置。<br>lastIndexOf(str, from)返回最后出现的位置。</p></li><li><p><strong>isNull()&isEmpty()</strong><br>isNull()和isEmpty()都是判断字符串为空。如果字符串中只有”\0”,isNull返回false,isEmpty返回true,未赋值的字符串isNull才返回true。</p></li><li><p><strong>contains()</strong><br>判断父字符串是否包含子字符串,返回true&false。</p></li><li><p><strong>endsWith()&startsWith()</strong><br>startsWith(str)判断是否以str开始,endsWith(str)判断是否以str结束。</p></li><li><p><strong>left()&right()</strong><br>left(num)从字符串左边取num个字符,right(num)从字符串右边取num个字符。</p></li><li><p><strong>section()</strong><br>section(sep, start, end)从字符串提取以sep为分隔符,从start端到end端。例如:</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">QString s1 = <span class="string">"shanghai, beijing, guangzhou, Hongkong"</span>, s2;</span><br><span class="line">s2 = s1.section(<span class="string">","</span>, <span class="number">0</span>, <span class="number">0</span>)<span class="comment">//s2 = "shanghai"</span></span><br><span class="line">s2 = s1.section(<span class="string">","</span>, <span class="number">1</span>, <span class="number">3</span>)<span class="comment">//s2 = "beijing, guangzhou, Hongkong"</span></span><br></pre></td></tr></tbody></table></figure></li></ul><script> document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } const img = document.createElement('img'); img.style = 'display:none !important;'; img.src = el.dataset.src; img.addEventListener('error', () => { img.remove(); el.style.color = 'inherit'; el.style.backgroundImage = 'none'; el.style.background = 'none'; }); img.addEventListener('load', () => { img.remove(); }); document.body.appendChild(img); }); </script>]]></content>
<summary type="html">
<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" cla
</summary>
<category term="Qt编程" scheme="http://cginmax.github.io/categories/Qt%E7%BC%96%E7%A8%8B/"/>
<category term="Qt C++" scheme="http://cginmax.github.io/tags/Qt-C/"/>
</entry>
<entry>
<title>Qt全局定义</title>
<link href="http://cginmax.github.io/2019/1/29/QtGlobal/"/>
<id>http://cginmax.github.io/2019/1/29/QtGlobal/</id>
<published>2019-01-29T06:21:11.000Z</published>
<updated>2019-01-29T08:26:16.903Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h1 id="Qt全局定义内容"><a href="#Qt全局定义内容" class="headerlink" title="Qt全局定义内容"></a>Qt全局定义内容</h1><p>在<qtglobal>中定义了有关Qt的数据类型、函数、宏,所有Qt类的头文件中都有包含这个头文件,不同在进行添加。</qtglobal></p><h2 id="Qt数据类型"><a href="#Qt数据类型" class="headerlink" title="Qt数据类型"></a>Qt数据类型</h2><p>Qt同样通过typedef将基本的数据类型进行包装。</p><table><thead><tr><th>Qt数据类型</th><th>等效定义</th><th>字节大小</th></tr></thead><tbody><tr><td>qint8</td><td>signed char</td><td>1</td></tr><tr><td>qint16</td><td>signed short</td><td>2</td></tr><tr><td>qint32</td><td>signed int</td><td>4</td></tr><tr><td>qint64</td><td>long long int</td><td>8</td></tr><tr><td>qlonglong</td><td>long long int</td><td>8</td></tr><tr><td>quint8</td><td>unsigned char</td><td>1</td></tr><tr><td>quint16</td><td>unsigned short</td><td>2</td></tr><tr><td>quint32</td><td>unsigned int</td><td>4</td></tr><tr><td>quint64</td><td>unsigned long long int</td><td>8</td></tr><tr><td>qulonglong</td><td>unsigned long long int</td><td>8</td></tr><tr><td>uchar</td><td>unsigned char</td><td>1</td></tr><tr><td>ushort</td><td>unsigned short</td><td>2</td></tr><tr><td>uint</td><td>unsigned int</td><td>4</td></tr><tr><td>ulong</td><td>unsigned long long int</td><td>8</td></tr><tr><td>qreal</td><td>double</td><td>8</td></tr><tr><td>qfloat16</td><td></td><td>2</td></tr></tbody></table><p>qreal默认是double类型,如果使用-qreal float进行配置,则为4个字节的float类型。</p><p>qfloat16是Qt5.9.0开始新增的,表示16位的浮点数,使用qfloat16要包含<qfloat16>。</qfloat16></p><h2 id="Qt函数"><a href="#Qt函数" class="headerlink" title="Qt函数"></a>Qt函数</h2><p><qtglobal>头文件中包含的函数大部分都是以模板类型为参数,返回模板类型,也有一些数学函数。<br>|Qt函数|功能|<br>|——— |——–|<br>|T qAbs(const T &value)|返回变量value的绝对值|<br>|bool qFuzzyCompare(double p1,double p2)|若p1近似等于p2,返回true|<br>|bool qFuzzyIsNull(double d)|如果d约等于0,返回true|<br>|const T &qMin(const T &value1, const T &value2)|返回value1和value2中的最小值|<br>|const T&qMax(const T&value1, const T&value2)|返回value1和value2中的最大值|<br>|int qrand()|获取一个随机数|<br>|void qsrand(uint seed)|以seed为初始化返回一个随机数|</qtglobal></p><h2 id="Qt宏定义"><a href="#Qt宏定义" class="headerlink" title="Qt宏定义"></a>Qt宏定义</h2><ul><li><strong>QT_VERSION</strong><br>这个宏展开数值为0xMMNNPP(MM=major, NN=minor, PP=patch),指的是编译器的版本号。例如:Qt5.12.1–>0x051201。</li><li><p><strong>QT_VERSION_CHECK</strong><br>该宏展开是版本号的一个整数,例如:</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><QtGlobal></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">if</span> (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><QtWidgets></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">else</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><QtGui></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>QT_VERSION_STR</strong></p></li></ul><p>该宏展开是Qt版本号字符串,例如”5.9.0”</p><ul><li><strong>Q_BYTE_ORDER、Q_BIG_ENDIAN、Q_LITTLE_ENDIAN</strong></li></ul><p>Q_BYTE_ORDER表示系统内存中的数据字节序,Q_BIG_ENDIAN是大端字节序,Q_LITTLE_ENDIAN是小端字节序。例如:<br></p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">if</span> Q_BYTE_ORDER == Q_BIG_ENDIAN</span></span><br><span class="line">…………</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br></pre></td></tr></tbody></table></figure><p></p><ul><li><strong>Q_NULLPTR</strong></li></ul><p>Qt重定义的nullptr指针。</p><ul><li><strong>Q_DECL_OVERRIDE</strong></li></ul><p>在类的定义中,定义一个重载虚函数时,需要添加该宏。如果使用该宏之后,对要重载的函数没有进行任何重载操作,编译器会报错。</p><ul><li><strong>Q_DECL_FINAL</strong></li></ul><p>对类中的虚函数进行final处理,表示不能再重载。该宏对类也有效果。<br></p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyBrain</span> <span class="title">Q_DECL_FINAL</span> {</span><span class="comment">//MyBrian将不会被其它类继承</span></span><br><span class="line">};</span><br></pre></td></tr></tbody></table></figure><p></p><ul><li><strong>Q_UNUSED(<em>name</em>)</strong></li></ul><p>该宏用在函数中定义不在函数体内使用的参数。也就是说当参数在函数体内没有使用,为了避免编译器报警告,就需要添加这个宏。</p><ul><li><strong>forever</strong></li></ul><p>forever创建一个无限循环</p><ul><li><strong>qDebug(const char *message)</strong></li></ul><p>用来调试程序输出时使用。</p><script> document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } const img = document.createElement('img'); img.style = 'display:none !important;'; img.src = el.dataset.src; img.addEventListener('error', () => { img.remove(); el.style.color = 'inherit'; el.style.backgroundImage = 'none'; el.style.background = 'none'; }); img.addEventListener('load', () => { img.remove(); }); document.body.appendChild(img); }); </script>]]></content>
<summary type="html">
<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" cla
</summary>
<category term="Qt编程" scheme="http://cginmax.github.io/categories/Qt%E7%BC%96%E7%A8%8B/"/>
<category term="Qt" scheme="http://cginmax.github.io/tags/Qt/"/>
</entry>
<entry>
<title>windows Socket</title>
<link href="http://cginmax.github.io/2019/1/27/windows-Socket/"/>
<id>http://cginmax.github.io/2019/1/27/windows-Socket/</id>
<published>2019-01-27T02:43:58.000Z</published>
<updated>2019-01-27T09:46:54.091Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h1 id="Windows-socket编程基础"><a href="#Windows-socket编程基础" class="headerlink" title="Windows socket编程基础"></a>Windows socket编程基础</h1><h2 id="一、Winsock初始化"><a href="#一、Winsock初始化" class="headerlink" title="一、Winsock初始化"></a>一、Winsock初始化</h2><p>在进行winsock编程前需要进行初始化,调用WSAStartup函数,设置当前的winsock的版本和初始化相对应版本的库。</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><winsock2.h></span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">WSAStartup</span><span class="params">(WORD wVersionRequested, LPWSADATA, lpWSAData)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>wVersionRequested:当前所使用的winsock版本信息。使用MAKEWORD()函数,产生一个版本号,副版本号为高位,主版本号为低位,如版本号为2.1,则MAKEWORD(1,2),返回0x0102。</li><li>lpWSAData:WSAData结构体变量指针</li><li>return:0成功,非0失败</li></ul><p>当要注销该库时使用函数<strong>WSACleanup(void);</strong>,成功返回0,失败返回SOCKET_ERROR。</p><h2 id="二、数据类型之间的转换"><a href="#二、数据类型之间的转换" class="headerlink" title="二、数据类型之间的转换"></a>二、数据类型之间的转换</h2><h3 id="网络与本低字节序的转换"><a href="#网络与本低字节序的转换" class="headerlink" title="网络与本低字节序的转换"></a>网络与本低字节序的转换</h3><p>在计算机当中,根据cpu或操作系统的不同可分为大端存储(Big Endian)和小端存储(Little Endian)。</p><p>大端存储:高位字节存放到地位地址<br>小端存储:高位字节存放到高位地址</p><h3 id="字节序转换函数"><a href="#字节序转换函数" class="headerlink" title="字节序转换函数"></a>字节序转换函数</h3><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="title">htos</span><span class="params">(<span class="keyword">unsigned</span> <span class="keyword">short</span>)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="title">ntoh</span><span class="params">(<span class="keyword">unsigned</span> <span class="keyword">short</span>)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="title">htol</span><span class="params">(<span class="keyword">unsigned</span> <span class="keyword">long</span>)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="title">ntoh</span><span class="params">(<span class="keyword">unsigned</span> <span class="keyword">long</span>)</span></span>;</span><br></pre></td></tr></tbody></table></figure><p>h代表主机(host)字节序,n代表网络(network)字节序。</p><p>在windows平台下,大部分采用大端法,但是在网络中以小端法方式传输,所以在接收时要进行字节序的转换。</p><h3 id="字符串跟IP地址之间的转换"><a href="#字符串跟IP地址之间的转换" class="headerlink" title="字符串跟IP地址之间的转换"></a>字符串跟IP地址之间的转换</h3><h4 id="从字符串转换到IP"><a href="#从字符串转换到IP" class="headerlink" title="从字符串转换到IP"></a>从字符串转换到IP</h4><p>在SOCKADDR_IN的sin_addr中保存的是32位整数型,而人为添加的IP是一个点分十进制字符串,所以需要通过转换才能使IP地址被传递到SOCKADDR_IN的变量中。这就是所谓的网络字节序的转换。</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//windows platform</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><WinSock2.h></span></span></span><br><span class="line"><span class="function"><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="title">inet_addr</span><span class="params">(<span class="keyword">const</span> <span class="keyword">char</span> *<span class="built_in">string</span>)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>return:成功时返回32位小端(或大端)序整数,失败返回INADDR_NONE</li></ul><h4 id="从IP转换到字符串"><a href="#从IP转换到字符串" class="headerlink" title="从IP转换到字符串"></a>从IP转换到字符串</h4><p>有时候需要获取到从网络当中获得的IP地址并通过点分十进制显示出来。在Windows平台上只有inet_ntoa(),没有inet_aton()。</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//windows platform</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><WinSock2.h></span></span></span><br><span class="line"><span class="function"><span class="keyword">char</span>* <span class="title">inet_ntoa</span><span class="params">(struct in_addr adr)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>in:具有整型IP地址的in_addr变量。</li><li>return:成功返回地址字符串,失败返回-1。</li></ul><h4 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h4><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*inet_addr用例*/</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">char</span> *ip_str1 = <span class="string">"192.168.0.1"</span>;</span><br><span class="line"> SOCKADDR_IN sockaddr;</span><br><span class="line"> <span class="comment">//将字符串转换成整数</span></span><br><span class="line"> sockaddr.sin_addr.s_addr = inet_addr(ip_str1);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*inet_ntoa用例*/</span></span><br><span class="line">{</span><br><span class="line"> SOCKADDR_IN sockaddr;</span><br><span class="line"> <span class="keyword">char</span> ip_str[<span class="number">20</span>];</span><br><span class="line"> sockaddr.sin_addr.s_addr = htonl(<span class="number">0x02030104</span>);</span><br><span class="line"></span><br><span class="line"> ip_str = inet_ntoa(sockaddr.sin_addr);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="WinSock2自带转换函数"><a href="#WinSock2自带转换函数" class="headerlink" title="WinSock2自带转换函数"></a>WinSock2自带转换函数</h3><p>WSAStringToAddress&WSAAddressToString,这两个转换函数功能跟inet_ntoa,inet_addr一致,支持IPv4和IPv6,但是不支持跨平台,兼容性差。</p><h4 id="WSAStringToAddress"><a href="#WSAStringToAddress" class="headerlink" title="WSAStringToAddress"></a>WSAStringToAddress</h4><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><WinSock2.h></span></span></span><br><span class="line"><span class="function">INT <span class="title">WSAStringToAddress</span><span class="params">(</span></span></span><br><span class="line"><span class="function"><span class="params"> _In_ LPWSTR AddressString,</span></span></span><br><span class="line"><span class="function"><span class="params"> _In_ INT AddressFamily,</span></span></span><br><span class="line"><span class="function"><span class="params"> _In_opt_ LPWSAPROTOCOL_INFOW lpProtocolInfo,</span></span></span><br><span class="line"><span class="function"><span class="params"> _Out_writes_bytes_to_(*lpAddressLength,*lpAddressLength) LPSOCKADDR lpAddress,</span></span></span><br><span class="line"><span class="function"><span class="params"> _Inout_ LPINT lpAddressLength</span></span></span><br><span class="line"><span class="function"><span class="params">)</span></span></span><br></pre></td></tr></tbody></table></figure><ul><li>AddressString:含有端口号和ip的字符串。</li><li>AddressFamily:地址协议族。</li><li>lpProtocolInfo:设置协议提供者,默认为NULL。</li><li>lpAddress:保存地址信息的SOCKADDR变量。</li><li>lpAddressLength:lpAddress长度的指针。</li><li>return:成功返回0,失败返回SOCKET_ERROR。</li></ul><h4 id="WSAAddressToString"><a href="#WSAAddressToString" class="headerlink" title="WSAAddressToString"></a>WSAAddressToString</h4><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">INT <span class="title">WSAAddressToString</span><span class="params">(</span></span></span><br><span class="line"><span class="function"><span class="params"> _In_reads_bytes_(dwAddressLength) LPSOCKADDR lpsaAddress,</span></span></span><br><span class="line"><span class="function"><span class="params"> _In_ DWORD dwAddressLength,</span></span></span><br><span class="line"><span class="function"><span class="params"> _In_opt_ LPWSAPROTOCOL_INFOW lpProtocolInfo,</span></span></span><br><span class="line"><span class="function"><span class="params"> _Out_writes_to_(*lpdwAddressStringLength,*lpdwAddressStringLength) LPWSTR lpszAddressString,</span></span></span><br><span class="line"><span class="function"><span class="params"> _Inout_ LPDWORD lpdwAddressStringLength</span></span></span><br><span class="line"><span class="function"><span class="params">)</span></span></span><br></pre></td></tr></tbody></table></figure><ul><li>lpsaAddress:需要转换的地址信息的SOCKADDR变量。</li><li>dwAddressLength:lpsaAddress长度的指针。</li><li>lpProtocolInfo:设置协议提供者,默认为NULL。</li><li>lpszAddressString:保存转换结果的字符串。</li><li>lpdwAddressStringLength:lpszAddressString存有地址信息的长度。</li></ul><h4 id="示例-1"><a href="#示例-1" class="headerlink" title="示例"></a>示例</h4><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*WSAStringToAddress用例*/</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">char</span> *ip_str = <span class="string">"192.168.0.1:9090"</span>;</span><br><span class="line"> SOCKADDR_IN sockaddr;</span><br><span class="line"> <span class="keyword">int</span> socklen = <span class="keyword">sizeof</span>(sockaddr);</span><br><span class="line"> <span class="comment">//将字符串IP转换成socket地址</span></span><br><span class="line"> WSAStringToAddress(ip_str, AF_INET, <span class="literal">NULL</span>, (SOCKADDR*)&sockaddr, &socklen);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*WSAAddressToString用例*/</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">char</span> ip_str[<span class="number">30</span>];</span><br><span class="line"> <span class="comment">//sockaddr具有IP地址和端口号信息</span></span><br><span class="line"> SOCKADDR_IN sockaddr;</span><br><span class="line"> <span class="keyword">int</span> socklen = <span class="keyword">sizeof</span>(sockaddr);</span><br><span class="line"> <span class="keyword">int</span> ip_buf_len = <span class="keyword">sizeof</span>(ip_str);</span><br><span class="line"> WSAAddressToString((SOCKADDR*)&sockaddr, &socklen, <span class="literal">NULL</span>, ip_str, &ip_buf_len);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="三、Windows-socket相关函数"><a href="#三、Windows-socket相关函数" class="headerlink" title="三、Windows socket相关函数"></a>三、Windows socket相关函数</h2><p>连接相关的函数都在<strong><font color="red">WinSock2.h</font></strong>中.<br><strong><br></strong></p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">SOCKET <span class="title">socket</span><span class="params">(<span class="keyword">int</span> af, <span class="keyword">int</span> type, <span class="keyword">int</span> protocol)</span></span>;</span><br></pre></td></tr></tbody></table></figure><p></p><ul><li>af:协议族,IPv4(AF_INET)或IPv6</li><li>type:socket类型,SOCK_STREAM, SOCKET_DGRAM, SOCK_RAW</li><li>protocol:socket使用的特定协议,默认为0</li><li>return:成功返回套接字句柄,失败返回INVALID_SOCKET</li></ul><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">bind</span><span class="params">(SOCKET s, <span class="keyword">const</span> struct sockaddr * name, <span class="keyword">int</span> namelen)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>s:socket返回的套接字</li><li>name:SOCKADDR类型的指针,可以通过强制类型转换,将SOCKADDR_IN转成SOCKADDR。</li><li>namelen:name的长度。</li><li>return:成功返回0,失败返回SOCKET_ERROR</li></ul><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">listen</span><span class="params">(SOCKET s, <span class="keyword">int</span> backlog)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>s:socket返回的套接字</li><li>backlog:请求连接队列的最大长度。</li></ul><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">accept</span><span class="params">(SOCKET s, struct sockaddr *addr, <span class="keyword">int</span> *addrlen)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>s:socket返回的套接字</li><li>addr:SOCKADDR类型的指针,可以通过强制类型转换,将SOCKADDR_IN转成SOCKADDR。</li><li>addrlen:addr的长度。</li><li>return:成功返回指向客户端的套接字,失败返回INVALID_SOCKET</li></ul><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">connect</span><span class="params">(SOCKET s, <span class="keyword">const</span> struct sockaddr *name, <span class="keyword">int</span> namelen)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>s:socket返回的套接字</li><li>name:SOCKADDR类型的指针,可以通过强制类型转换,将SOCKADDR_IN转成SOCKADDR。</li><li>namelen:name的长度。</li><li>return:成功返回0,失败返回SOCKET_ERROR</li></ul><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">closesocket</span><span class="params">(SOCKET s)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>s:要断开的socket套接字</li><li><p>return:成功返回0,失败返回SOCKET_ERROR。</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">shutdonw</span><span class="params">(SOCKET s, <span class="keyword">int</span> how)</span></span>;</span><br></pre></td></tr></tbody></table></figure></li><li><p>s:要断开的socket套接字</p></li><li>how:断开方式。SD_RECEIVE:断开输入流;SD_SEND:断开输出流;SD_BOTH:同时断开I/O流。</li><li>return:成功返回0,失败返回SOCKET_ERROR。<br></li></ul><h3 id="TCP数据传输I-O函数"><a href="#TCP数据传输I-O函数" class="headerlink" title="TCP数据传输I/O函数"></a>TCP数据传输I/O函数</h3><p><strong><br></strong></p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">send</span><span class="params">(SOCKET s, <span class="keyword">const</span> <span class="keyword">char</span> *buf, <span class="keyword">int</span> len, <span class="keyword">int</span> flags)</span></span>;</span><br></pre></td></tr></tbody></table></figure><p></p><ul><li>s:socket返回的套接字</li><li>buf:发送的数据内容</li><li>len:发送数据的最大长度</li><li>flags:标识,默认0即可</li><li>return:发送成功返回发送个数</li></ul><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">recv</span><span class="params">(SOCKET s, <span class="keyword">const</span> <span class="keyword">char</span> *buf, <span class="keyword">int</span> len, <span class="keyword">int</span> flags)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>s:socket返回的套接字</li><li>buf:接收数据存放的数组</li><li>len:接收数据的最大长度</li><li>flags:标识,默认0即可</li><li>return:接收成功返回实际接收个数<br></li></ul><h3 id="UDP数据传输I-O函数"><a href="#UDP数据传输I-O函数" class="headerlink" title="UDP数据传输I/O函数"></a>UDP数据传输I/O函数</h3><p>UDP连接不需要确认就可以直接发送数据<br><strong><br></strong></p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><WinSock2.h></span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">sendto</span><span class="params">(SOCKET s, <span class="keyword">const</span> <span class="keyword">char</span> * buf, <span class="keyword">int</span> len, <span class="keyword">int</span> flags, <span class="keyword">const</span> struct sockaddr * to, <span class="keyword">int</span> tolen)</span></span>;</span><br></pre></td></tr></tbody></table></figure><p></p><ul><li>s:socket返回的套接字</li><li>buf:待发送数据内容</li><li>len:待传输的数据长度,以字节为单位</li><li>flags:标识,默认0即可</li><li>to:存有目标地址的SOCKADDR结构体变量地址值</li><li>tolen:to地址值结构体变量长度</li><li>return:成功返回传输字节数,失败返回-1</li></ul><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">recvfrom</span><span class="params">(SOCKET s, <span class="keyword">const</span> <span class="keyword">char</span> * buf, <span class="keyword">int</span> len, <span class="keyword">int</span> flags, <span class="keyword">const</span> struct sockaddr * from, <span class="keyword">int</span> *fromlen)</span></span>;</span><br></pre></td></tr></tbody></table></figure><ul><li>s:socket返回的套接字</li><li>buf:待接收数据的数组</li><li>len:可接受的数据的最大长度</li><li>flags:标识,默认0即可</li><li>from:存有发送端地址的SOCKADDR结构体变量地址值</li><li>fromlen:from地址值结构体变量指针长度</li><li>return:成功返回传输字节数,失败返回-1<br></li></ul><script> document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } const img = document.createElement('img'); img.style = 'display:none !important;'; img.src = el.dataset.src; img.addEventListener('error', () => { img.remove(); el.style.color = 'inherit'; el.style.backgroundImage = 'none'; el.style.background = 'none'; }); img.addEventListener('load', () => { img.remove(); }); document.body.appendChild(img); }); </script>]]></content>
<summary type="html">
<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" cla
</summary>
<category term="windows socket编程" scheme="http://cginmax.github.io/tags/windows-socket%E7%BC%96%E7%A8%8B/"/>
</entry>
<entry>
<title>aplayer-给博文添加音乐</title>
<link href="http://cginmax.github.io/2018/11/18/playMusic/"/>
<id>http://cginmax.github.io/2018/11/18/playMusic/</id>
<published>2018-11-18T04:37:09.000Z</published>
<updated>2018-11-21T08:08:31.416Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h1 id="aplayer的安装和配置"><a href="#aplayer的安装和配置" class="headerlink" title="aplayer的安装和配置"></a>aplayer的安装和配置</h1><h2 id="安装aplayer"><a href="#安装aplayer" class="headerlink" title="安装aplayer"></a>安装aplayer</h2><p>在博客目录下运行</p><figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm <span class="keyword">install</span> hexo-tag-aplayer <span class="comment">--save</span></span><br></pre></td></tr></tbody></table></figure><h2 id="用法"><a href="#用法" class="headerlink" title="用法"></a>用法</h2><figure class="highlight clojure"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% aplayer title author url [picture_url, narrow, autoplay, width:xxx, lrc:xxx] %}</span><br></pre></td></tr></tbody></table></figure><h2 id="选项介绍"><a href="#选项介绍" class="headerlink" title="选项介绍"></a>选项介绍</h2><ul><li><code>title</code>: 音乐标题</li><li><code>author</code>: 音乐作者</li><li><code>url</code>: 音乐文件的url</li><li><code>picture_url</code>: 可选项,音乐图片的url</li><li><code>narrow</code>: 可选项,设置为小型的风格</li><li><code>autoplay</code>:可选项,设置自动播放</li><li><code>width</code>: 可选项,设置播放器ui的宽度,默认是100%</li><li><code>lrc</code>: 可选项,设置歌词</li></ul><p>关于资源文件的存放和配置,请查阅<a href="https://hexo.io/zh-cn/docs/asset-folders" target="_blank" rel="noopener">官方文档</a>。</p><p>配置例子:<br></p><figure class="highlight gcode"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{<span class="meta">%</span> aplayer <span class="string">"Minecraft"</span> <span class="string">"C418"</span> <span class="string">"Minecraft.mp3"</span> <span class="string">"Minecraft.jpg"</span> <span class="string">"lrc:Minecraft.txt"</span> <span class="meta">%</span>}</span><br></pre></td></tr></tbody></table></figure><p></p> <div id="aplayer-UgfRykZi" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;"> <pre class="aplayer-lrc-content"></pre> </div> <script> var ap = new APlayer({ element: document.getElementById("aplayer-UgfRykZi"), narrow: false, autoplay: false, showlrc: false, music: { title: "Minecraft", author: "C418", url: "Minecraft.mp3", pic: "/2018/11/18/playMusic/Minecraft.jpg", lrc: "" } }); window.aplayers || (window.aplayers = []); window.aplayers.push(ap); </script><h2 id="单独配置歌词"><a href="#单独配置歌词" class="headerlink" title="单独配置歌词"></a>单独配置歌词</h2><p>用aplayerlrc显示歌词。</p><figure class="highlight mel"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% aplayerlrc <span class="string">"title"</span> <span class="string">"author"</span> <span class="string">"url"</span> <span class="string">"autoplay"</span> %}</span><br><span class="line">[<span class="number">00</span>:<span class="number">00.00</span>]lrc here</span><br><span class="line">{% endaplayerlrc %}</span><br></pre></td></tr></tbody></table></figure><h2 id="播放列表配置"><a href="#播放列表配置" class="headerlink" title="播放列表配置"></a>播放列表配置</h2><p>用aplayerlist配置播放列表。</p><figure class="highlight ruby"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">{% aplayerlist %}</span><br><span class="line">{</span><br><span class="line"> <span class="string">"narrow"</span>: <span class="literal">false</span>, <span class="regexp">//</span> 可选项,小窗风格</span><br><span class="line"> <span class="string">"autoplay"</span>: <span class="literal">true</span>, <span class="regexp">//</span> 可选项, 自动播放歌曲,不支持手机浏览器</span><br><span class="line"> <span class="string">"mode"</span>: <span class="string">"random"</span>, <span class="regexp">//</span> 可选项,播放模式选择,值参: <span class="string">`random`</span> <span class="string">`single`</span> <span class="string">`circulation`</span>(loop) <span class="string">`order`</span>(no loop), 默认: <span class="string">`circulation`</span></span><br><span class="line"> <span class="string">"showlrc"</span>: <span class="number">3</span>, <span class="regexp">//</span> 可选项, 显示歌词, 有 <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span></span><br><span class="line"> <span class="string">"mutex"</span>: <span class="literal">true</span>, <span class="regexp">//</span> 可选项, 只允许播放一首歌</span><br><span class="line"> <span class="string">"theme"</span>: <span class="string">"#e6d0b2"</span>, <span class="regexp">//</span> 可选项, 设置颜色, 默认: <span class="comment">#b7daff</span></span><br><span class="line"> <span class="string">"preload"</span>: <span class="string">"metadata"</span>, <span class="regexp">//</span> 可选项, 加载歌曲的方式, 值参: <span class="string">'none'</span> <span class="string">'metadata'</span> <span class="string">'auto'</span>, 默认: <span class="string">'auto'</span></span><br><span class="line"> <span class="string">"listmaxheight"</span>: <span class="string">"600px"</span>, <span class="regexp">//</span> 可选项, 播放列表的最大高度</span><br><span class="line"> <span class="string">"music"</span>: [</span><br><span class="line"> {</span><br><span class="line"> <span class="string">"title"</span>: <span class="string">"Music1"</span>,</span><br><span class="line"> <span class="string">"author"</span>: <span class="string">"Author1"</span>,</span><br><span class="line"> <span class="string">"url"</span>: <span class="string">"Music1.mp3"</span>,</span><br><span class="line"> <span class="string">"pic"</span>: <span class="string">"Music1.jpeg"</span>,</span><br><span class="line"> <span class="string">"lrc"</span>: <span class="string">"Music1.txt"</span></span><br><span class="line"> },</span><br><span class="line"> {</span><br><span class="line"> <span class="string">"title"</span>: <span class="string">"Music2"</span>,</span><br><span class="line"> <span class="string">"author"</span>: <span class="string">"Author2"</span>,</span><br><span class="line"> <span class="string">"url"</span>: <span class="string">"Music2.mp3"</span>,</span><br><span class="line"> <span class="string">"pic"</span>: <span class="string">"Music2.jpg"</span></span><br><span class="line"> }</span><br><span class="line"> ]</span><br><span class="line">}</span><br><span class="line">{% endaplayerlist %}</span><br></pre></td></tr></tbody></table></figure><script>console.error("SyntaxError: Unexpected token } in JSON at position 403");</script><p>v</p><h2 id="更多"><a href="#更多" class="headerlink" title="更多"></a>更多</h2><table><thead><tr><th>Windows数据类型</th><th>基本数据类型</th><th>说明</th></tr></thead><tbody><tr><td>CHAR</td><td>char</td></tr><tr><td>BYTE</td><td>unsigned char</td><td></td></tr><tr><td>BOOL</td><td>int</td><td>布尔类型,TRUE & FALSE</td></tr><tr><td>INT</td><td>int</td></tr><tr><td>LONG</td><td>long</td><td>32位长整型</td></tr><tr><td>WORD</td><td>unsigned short</td><td>16位字类型</td></tr><tr><td>DWORD</td><td>unsigned long</td></tr><tr><td>LPARAM</td><td>long</td><td>64位消息参数类型</td></tr><tr><td>WPARAM</td><td>unsigned int</td><td>64位消息参数类型</td></tr><tr><td>LPCSTR</td><td>const char*</td><td>字符串常量指针类型</td></tr><tr><td>LPSTR</td><td>char*</td><td>字符串指针类型</td></tr><tr><td>LPVOID</td><td>void*</td><td>空指针</td></tr><tr><td>LRESULT</td><td>long</td><td>32位消息处理结果类型</td></tr><tr><td>SHORT</td><td>short</td><td>16位短整型</td></tr><tr><td>UINT</td><td>unsigned int</td><td>32位无符号整型</td></tr><tr><td>WCHAR</td><td>unsigned short</td><td>16位宽字符类型</td></tr></tbody></table><p>|COLORREF|DWORD</p><script> document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } const img = document.createElement('img'); img.style = 'display:none !important;'; img.src = el.dataset.src; img.addEventListener('error', () => { img.remove(); el.style.color = 'inherit'; el.style.backgroundImage = 'none'; el.style.background = 'none'; }); img.addEventListener('load', () => { img.remove(); }); document.body.appendChild(img); }); </script>]]></content>
<summary type="html">
<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" cla
</summary>
<category term="aplayer" scheme="http://cginmax.github.io/tags/aplayer/"/>
</entry>
<entry>
<title>Linux一键搭建KMS激活服务器激活Windows和Office</title>
<link href="http://cginmax.github.io/2018/11/12/kms-script/"/>
<id>http://cginmax.github.io/2018/11/12/kms-script/</id>
<published>2018-11-12T02:48:41.702Z</published>
<updated>2018-11-12T04:59:31.831Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>Linux 快速搭建 KMS 激活服务器,让 PC 激活 Windows 和 Office 并自动续期,告别网上的来路不明的激活工具,防止意外中毒。</p><h1 id="One-key-KMS"><a href="#One-key-KMS" class="headerlink" title="One key KMS"></a>One key KMS</h1><p>虽然目前已经有各种 PC 用的 KMS 激活程序,例如KMSAuto或者KMS VL ALL之类的,但是他们都会被 Windows Defender 或者普通的杀毒软件认为是病毒。<br>虽然你“相信”这些软件被报毒是很正常的,直接加入白名单了事,然而你确实不知道你从网上搜索下载的这些激活程序是不是真的经过别人的改造植入了病毒……</p><p>因此,我们可以利用自己的 Linux VPS 搭建 KMS 激活服务器给自己的 PC 使用,这样既安全无毒又不怕激活丢失。</p><h2 id="搭建KMS服务"><a href="#搭建KMS服务" class="headerlink" title="搭建KMS服务"></a>搭建KMS服务</h2><p><a href="https://github.com/dakkidaze/one-key-kms" target="_blank" rel="noopener">one-key-KMS</a>地址</p><p>1.下载one-key-kms脚本,并安装源码</p><ul><li><p>CentOS / Redhat / Fedora</p> <figure class="highlight llvm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://raw.githubusercontent.com/dakkidaze/<span class="keyword">one</span>-key-kms/master/<span class="keyword">one</span>-key-kms-centos.sh && chmod +<span class="keyword">x</span> <span class="keyword">one</span>-key-kms-centos.sh &&./<span class="keyword">one</span>-key-kms-centos.sh</span><br></pre></td></tr></tbody></table></figure></li><li><p>Debian / Ubuntu / Mint</p> <figure class="highlight llvm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://raw.githubusercontent.com/dakkidaze/<span class="keyword">one</span>-key-kms/master/<span class="keyword">one</span>-key-kms-debian.sh && chmod +<span class="keyword">x</span> <span class="keyword">one</span>-key-kms-debian.sh && ./<span class="keyword">one</span>-key-kms-debian.sh</span><br></pre></td></tr></tbody></table></figure></li></ul><blockquote><p>本人采用Ubuntu系统进行安装,安装时最好具有root权限,以免权限不足报错。</p></blockquote><p>2.将完成下载后的vlmcsd文件夹放入到/usr/local/,就能够在任何位置执行kms.sh。</p><p>3.下载kms脚本<br> </p><figure class="highlight vim"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget http<span class="variable">s:</span>//raw.githubusercontent.<span class="keyword">com</span>/dakkidaze/one-key-kms/master/kms.<span class="keyword">sh</span> && chmod +<span class="keyword">x</span> kms.<span class="keyword">sh</span></span><br></pre></td></tr></tbody></table></figure><p></p><p>下载后,打开kms.sh,更改DAEMON的路径为=存放vlmcsd的根目录/vlmcsd/bin/vlmcd</p><p>4.脚本运行</p><ul><li>运行参数<br>启动脚本:./kms.sh start<br>停止脚本:./kms.sh stop<br>重启脚本:./kms.sh restart<br>查看运行状态:./kms.sh status</li></ul><p>5.打开1668端口</p><ul><li><p>CentOS / Redhat / Fedora<br> iptables -I INPUT -p tcp –dport 1688 -j ACCEPT</p></li><li><p>Debian / Ubuntu / Mint<br> sudo ufw allow 1688 </p></li></ul><h2 id="激活Windows"><a href="#激活Windows" class="headerlink" title="激活Windows"></a>激活Windows</h2><p>以管理员身份运行cmd或者PowerShell,输入以下命令<br></p><figure class="highlight jboss-cli"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">cd</span> <span class="string">/d</span> <span class="string">"%SystemRoot%\system32"</span></span><br><span class="line">slmgr <span class="string">/skms</span> 你的KMS服务端主机的IP或者域名</span><br><span class="line">slmgr <span class="string">/ato</span></span><br><span class="line">slmgr <span class="string">/xpr</span></span><br></pre></td></tr></tbody></table></figure><p></p><p>弹出窗口后表示激活成功。<br>每过 180 天,系统都会自动与你的 KMS 服务器通信来激活 Windows,只要到时候你的 KMS 服务器还在,Windows 就能继续激活。<br>注意:Linux服务开启的时候才能进行激活,不然报各种ERROR</p><h2 id="激活Office"><a href="#激活Office" class="headerlink" title="激活Office"></a>激活Office</h2><p>以管理员身份运行cmd或者PowerShell,输入以下命令<br></p><figure class="highlight jboss-cli"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 默认路径是以下路径,自定义安装找到相应的ospp.vbs即可</span></span><br><span class="line"><span class="keyword">cd</span> <span class="string">"C:\Program Files\Microsoft Office\Office16"</span></span><br><span class="line">cscript ospp.vbs <span class="string">/sethst</span>:你的KMS服务端主机的IP或者域名</span><br><span class="line">cscript ospp.vbs <span class="string">/act</span></span><br></pre></td></tr></tbody></table></figure><p></p><p>成功的话会报Successful</p><h2 id="开机自启动"><a href="#开机自启动" class="headerlink" title="开机自启动"></a>开机自启动</h2><p>如果只是想简单的让 KMS 服务在 Linux 上开机自启,那么编辑/etc/rc.local文件,在exit 0(如果有)前面加上一句<br></p><figure class="highlight leaf"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">#</span><span class="params">(<span class="variable">shell</span> <span class="variable">dir</span>)</span></span>为该脚本存放的目录</span><br><span class="line">(shell dir)/kms.sh start</span><br></pre></td></tr></tbody></table></figure><p></p><blockquote><p>本文转载自<a href="https://lolico.moe/tutorial/linux-kms-server.html" target="_blank" rel="noopener">神代绮凛</a><br>如有问题,请联系邮箱<a href="mailto:cginmax1998@gmail.com" target="_blank" rel="noopener">cginmax1998@gmail.com</a></p></blockquote><script> document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } const img = document.createElement('img'); img.style = 'display:none !important;'; img.src = el.dataset.src; img.addEventListener('error', () => { img.remove(); el.style.color = 'inherit'; el.style.backgroundImage = 'none'; el.style.background = 'none'; }); img.addEventListener('load', () => { img.remove(); }); document.body.appendChild(img); }); </script>]]></content>
<summary type="html">
<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" cla
</summary>
<category term="搬运" scheme="http://cginmax.github.io/categories/From-another/"/>
<category term="脚本" scheme="http://cginmax.github.io/categories/From-another/%E8%84%9A%E6%9C%AC/"/>
<category term="kms" scheme="http://cginmax.github.io/categories/From-another/%E8%84%9A%E6%9C%AC/kms/"/>
<category term="Windows" scheme="http://cginmax.github.io/tags/Windows/"/>
<category term="kms VL激活" scheme="http://cginmax.github.io/tags/kms-VL%E6%BF%80%E6%B4%BB/"/>
</entry>
<entry>
<title>C++的输入输出流操作符的重载</title>
<link href="http://cginmax.github.io/2018/11/12/ioStreamOperatorOfC++/"/>
<id>http://cginmax.github.io/2018/11/12/ioStreamOperatorOfC++/</id>
<published>2018-11-12T02:00:39.327Z</published>
<updated>2018-11-12T09:58:09.475Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>在C++中,自定义类时,需要重载一些特定的操作符,让自定义类具有跟基本数据类型一致的运算符操作。</p><ul><li>自定义类的基本模型</li><li>类内部重载</li><li>类外部重载</li><li>不同点和原因</li></ul><h1 id="自定义类的基本模型"><a href="#自定义类的基本模型" class="headerlink" title="自定义类的基本模型"></a>自定义类的基本模型</h1><p>用模板类更加直观的发现问题的所在。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">T</span>></span></span><br><span class="line"><span class="class"><span class="title">class</span> <span class="title">Table</span>{</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">Table();</span><br><span class="line"><span class="function">T <span class="title">getData</span><span class="params">()</span></span>;</span><br><span class="line">~Table();</span><br><span class="line"><span class="comment">//...</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line">T width;</span><br><span class="line">T height;</span><br><span class="line">T length;</span><br><span class="line">};</span><br></pre></td></tr></tbody></table></figure><h1 id="类内部重载"><a href="#类内部重载" class="headerlink" title="类内部重载"></a>类内部重载</h1><p>在类内部添加输入输出流操作符重载时,需要添加友元friend</p><figure class="highlight cpp"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">T</span>></span></span><br><span class="line"><span class="class"><span class="title">class</span> <span class="title">Table</span>{</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">Table();</span><br><span class="line"><span class="function">T <span class="title">getData</span><span class="params">()</span></span>;</span><br><span class="line">~Table();</span><br><span class="line"></span><br><span class="line"><span class="keyword">friend</span> <span class="built_in">std</span>::ostream& <span class="keyword">operator</span><<(<span class="built_in">std</span>::ostream& os, Table<T>& t)</span><br><span class="line">{</span><br><span class="line"><span class="comment">//能够访问到内部private成员</span></span><br><span class="line"><span class="keyword">return</span> os << t.width << <span class="string">" "</span> << t.height << <span class="string">" "</span> << t.length;</span><br><span class="line">}</span><br><span class="line"><span class="comment">//...</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line">T width;</span><br><span class="line">T height;</span><br><span class="line">T length;</span><br><span class="line">};</span><br></pre></td></tr></tbody></table></figure><h1 id="类外部重载"><a href="#类外部重载" class="headerlink" title="类外部重载"></a>类外部重载</h1><p>类外部重载时,不需要添加友元,但需要声明为模板函数。</p><figure class="highlight cpp"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">T</span>></span></span><br><span class="line"><span class="class"><span class="title">class</span> <span class="title">Table</span>{</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">Table();</span><br><span class="line"><span class="function">T <span class="title">getData</span><span class="params">()</span></span>;</span><br><span class="line">~Table();</span><br><span class="line"></span><br><span class="line"><span class="comment">//...</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line">T width;</span><br><span class="line">T height;</span><br><span class="line">T length;</span><br><span class="line">}</span><br><span class="line"><span class="comment">//输出流重载</span></span><br><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">T</span>></span></span><br><span class="line"><span class="class"><span class="title">std</span>:</span>:ostream& <span class="keyword">operator</span><<(<span class="built_in">std</span>::ostream& os, Table<T>& t)</span><br><span class="line">{</span><br><span class="line"><span class="comment">//不能访问private成员</span></span><br><span class="line"><span class="comment">//return os << t.width << " " << t.height << " " << t.length;</span></span><br><span class="line"><span class="keyword">return</span> os << t.getData();</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h1 id="不同点和原因"><a href="#不同点和原因" class="headerlink" title="不同点和原因"></a>不同点和原因</h1><p>在类内部定义时,需要添加为友元,类才能去识别该重载函数是内部成员函数。</p><p>在类外部定义时,可以抛开友元属性,取而代之的是函数模板声明,毕竟类不能识别为它内部成员函数。在类外定义的重载函数是不能调用内部private成员的,要在类内部定义公共调用接口。</p><script> document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } const img = document.createElement('img'); img.style = 'display:none !important;'; img.src = el.dataset.src; img.addEventListener('error', () => { img.remove(); el.style.color = 'inherit'; el.style.backgroundImage = 'none'; el.style.background = 'none'; }); img.addEventListener('load', () => { img.remove(); }); document.body.appendChild(img); }); </script>]]></content>
<summary type="html">
<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" cla
</summary>
<category term="C++" scheme="http://cginmax.github.io/tags/C/"/>
<category term="操作符重载" scheme="http://cginmax.github.io/tags/operator-Override/"/>
</entry>
<entry>
<title>个人博客搭建详解(Windows和Mac通用版)</title>
<link href="http://cginmax.github.io/2018/11/10/build-blog/"/>
<id>http://cginmax.github.io/2018/11/10/build-blog/</id>
<published>2018-11-10T03:19:01.371Z</published>
<updated>2018-11-18T05:56:21.883Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><blockquote><p>Hexo 是一个基于nodejs 的静态博客网站生成器,作者是来自台湾的 Tommy Chen</p></blockquote><script> document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } const img = document.createElement('img'); img.style = 'display:none !important;'; img.src = el.dataset.src; img.addEventListener('error', () => { img.remove(); el.style.color = 'inherit'; el.style.backgroundImage = 'none'; el.style.background = 'none'; }); img.addEventListener('load', () => { img.remove(); }); document.body.appendChild(img); }); </script>]]></content>
<summary type="html">
<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" cla
</summary>
<category term="实用技术" scheme="http://cginmax.github.io/categories/%E5%AE%9E%E7%94%A8%E6%8A%80%E6%9C%AF/"/>
<category term="个人博客" scheme="http://cginmax.github.io/categories/%E5%AE%9E%E7%94%A8%E6%8A%80%E6%9C%AF/my-Blog/"/>
<category term="建站" scheme="http://cginmax.github.io/tags/build-Blog/"/>
<category term="个人博客" scheme="http://cginmax.github.io/tags/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
</entry>
<entry>
<title>基于github的个人博客</title>
<link href="http://cginmax.github.io/2018/11/9/README1/"/>
<id>http://cginmax.github.io/2018/11/9/README1/</id>
<published>2018-11-09T11:58:14.482Z</published>
<updated>2018-11-10T10:10:41.998Z</updated>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h1 id="建站原因"><a href="#建站原因" class="headerlink" title="建站原因"></a>建站原因</h1><p>最近无聊,瞎比逛了几个大佬的博客(都是二次元男(●ˇ∀ˇ●)),发现都是同一类型的博客类型,寻思着这东西绝壁有别人做好的框架,所以google/baidu一下。发现内容很丰富,土豪类的wordpress或者adobe的protfolio,穷人类的大部分都是基于git仓库来搭建。很明显我选择了github(微笑)。</p><h1 id="建站概括"><a href="#建站概括" class="headerlink" title="建站概括"></a>建站概括</h1><p>用的是hexo和github结合建出来的。以gitHub的仓库作为域名,Hexo里面的js功能进行设置和装饰,就可以搞出这么个东西。有兴趣的朋友看看<a href="https://www.jianshu.com/p/380290deb8f0" target="_blank" rel="noopener">这里</a></p><blockquote><p>Hexo 是一个基于nodejs 的静态博客网站生成器,作者是来自台湾的 Tommy Chen。</p></blockquote><h1 id="感想"><a href="#感想" class="headerlink" title="感想"></a>感想</h1><p>接触之前没了解过的东西感觉非常好玩,上手也快,<del>也可以跟别人装b</del>。主要是自己之前学过markdown、git等等杂七杂八的东西,大部分命令很容易理解,在windows下搭建完之后,跑到Linux下再搭建一遍,多熟悉一下操作,而且不知道为什么,感觉搞这东西特别爽😂。<br>以后博客里面主要发布学习计算机、编程类的东西,吹水、牢骚之类的就不在有了,要让这个<del>垃圾</del>简单博客更加充实。</p><script> document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } const img = document.createElement('img'); img.style = 'display:none !important;'; img.src = el.dataset.src; img.addEventListener('error', () => { img.remove(); el.style.color = 'inherit'; el.style.backgroundImage = 'none'; el.style.background = 'none'; }); img.addEventListener('load', () => { img.remove(); }); document.body.appendChild(img); }); </script>]]></content>
<summary type="html">
<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" cla
</summary>
<category term="吹水" scheme="http://cginmax.github.io/tags/talk-Blog/"/>
<category term="闲聊" scheme="http://cginmax.github.io/tags/%E9%97%B2%E8%81%8A/"/>
</entry>
</feed>