-
Notifications
You must be signed in to change notification settings - Fork 0
/
Network-Lab1.html
333 lines (160 loc) · 22.9 KB
/
Network-Lab1.html
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
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Network-Lab1</title>
<link rel="stylesheet" href="https://stackedit.io/res-min/themes/base.css" />
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>
</head>
<body><div class="container"><h1 id="lab1-reliable-data-transmission-under-high-latency-and-high-packet-loss-rate-network">Lab1: Reliable Data Transmission Under High Latency And High Packet Loss Rate Network</h1>
<p>Due: <strong>2016.6.5</strong> <br>
Start early! This lab is not easy!</p>
<h2 id="goal">Goal</h2>
<p>In this lab, you need to implement a reliable data transmission protocol like TCP. This lab will emulate a high latency and high packet loss rate network environment, and your goal is to maximise the transfer speed under the network.</p>
<h2 id="how-this-lab-works">How this lab works</h2>
<h3 id="overview">Overview</h3>
<p>In short, the data is transferred with the following steps:</p>
<ol>
<li><p>A program tries to open a <strong>TCP</strong> connection to <code>127.0.0.1:7000</code> , and sends <strong>HTTP GET</strong> request</p></li>
<li><p>Your program <strong>Alice</strong> listened on <code>127.0.0.1:7000</code> , accepted the connection, then send data to <code>172.19.0.1</code> . It’s the IP address of a created TUN device <strong>tunA</strong></p></li>
<li><p>The transfer program (provided by this lab) transfers your packet to <strong>tunB</strong>, and the destination IP is change to <code>172.20.0.1</code></p></li>
<li><p>Your program <strong>Bob</strong> listened on <code>172.20.0.1</code> , get the request from <strong>Alice</strong>, then proxy the TCP connection to <code>127.0.0.1:8000</code></p></li>
<li><p>There is a HTTP server (or whatever) accepts connection at <code>127.0.0.1:8000</code>, replies to the HTTP request. </p></li>
</ol>
<p>Then, <strong>Bob</strong> should deliver the data from <code>172.20.0.1</code> to <code>172.20.0.2</code> on <strong>tunB</strong>. The transfer program transforms the packet, from <code>172.19.0.1</code> to <code>172.19.0.2</code>. <strong>Alice</strong> will get the packet on <strong>tunA</strong>, then she need to write data back to the origin TCP connection.</p>
<p>You need to implement the <strong>Alice</strong> and <strong>Bob</strong>. They should be the same program launched with different arguments:</p>
<pre class="prettyprint"><code class="language-sh hljs brainfuck"><span class="hljs-string">.</span><span class="hljs-comment">/lab1</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">alice</span>
<span class="hljs-string">.</span><span class="hljs-comment">/lab1</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">bob</span></code></pre>
<h3 id="how-tun-works">How TUN works</h3>
<p><strong>TUN</strong> and <strong>TAP</strong> are virtual network kernel devices. It’s a network interface emulated by software. The program could read and write packets on the interface.</p>
<p>In this lab, the transfer program will create two virtual interface <strong>tunA</strong> and <strong>tunB</strong>:</p>
<p><strong>tunA</strong>: self ip <code>172.19.0.2</code>, peer ip <code>172.19.0.1</code> <br>
<strong>tunB</strong>: self ip <code>172.20.0.1</code>, peer ip <code>172.20.0.2</code></p>
<p>To explain how the transfer program works, you can try to ping <code>172.19.0.1</code>.</p>
<pre class="prettyprint"><code class=" hljs livecodeserver">$ ping <span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>
PING <span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span> (<span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>): <span class="hljs-number">56</span> data <span class="hljs-keyword">bytes</span>
<span class="hljs-number">64</span> <span class="hljs-keyword">bytes</span> <span class="hljs-built_in">from</span> <span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>: icmp_seq=<span class="hljs-number">0</span> ttl=<span class="hljs-number">64</span> <span class="hljs-built_in">time</span>=<span class="hljs-number">0.603</span> ms</code></pre>
<p>If you do a <strong>tcpdump</strong> on <strong>tunA</strong>, you’ll get</p>
<pre class="prettyprint"><code class=" hljs lasso">$ sudo tcpdump <span class="hljs-attribute">-i</span> tunA <span class="hljs-attribute">-n</span>
tcpdump: verbose output suppressed, use <span class="hljs-attribute">-v</span> <span class="hljs-literal">or</span> <span class="hljs-attribute">-vv</span> for <span class="hljs-literal">full</span> protocol decode
listening <span class="hljs-keyword">on</span> tun8, <span class="hljs-keyword">link</span><span class="hljs-attribute">-type</span> <span class="hljs-built_in">NULL</span> (BSD loopback), capture size <span class="hljs-number">262144</span> <span class="hljs-built_in">bytes</span>
<span class="hljs-number">22</span>:<span class="hljs-number">35</span>:<span class="hljs-number">38.209997</span> IP <span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.2</span> <span class="hljs-subst">></span> <span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>: ICMP echo request, id <span class="hljs-number">47671</span>, seq <span class="hljs-number">0</span>, length <span class="hljs-number">64</span>
<span class="hljs-number">22</span>:<span class="hljs-number">35</span>:<span class="hljs-number">38.210310</span> IP <span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span> <span class="hljs-subst">></span> <span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.2</span>: ICMP echo reply, id <span class="hljs-number">47671</span>, seq <span class="hljs-number">0</span>, length <span class="hljs-number">64</span></code></pre>
<p>And on <strong>tunB</strong>:</p>
<pre class="prettyprint"><code class=" hljs lasso">$ sudo tcpdump <span class="hljs-attribute">-i</span> tun9 <span class="hljs-attribute">-n</span>
tcpdump: verbose output suppressed, use <span class="hljs-attribute">-v</span> <span class="hljs-literal">or</span> <span class="hljs-attribute">-vv</span> for <span class="hljs-literal">full</span> protocol decode
listening <span class="hljs-keyword">on</span> tun9, <span class="hljs-keyword">link</span><span class="hljs-attribute">-type</span> <span class="hljs-built_in">NULL</span> (BSD loopback), capture size <span class="hljs-number">262144</span> <span class="hljs-built_in">bytes</span>
<span class="hljs-number">22</span>:<span class="hljs-number">35</span>:<span class="hljs-number">38.210106</span> IP <span class="hljs-number">172.20</span><span class="hljs-number">.0</span><span class="hljs-number">.2</span> <span class="hljs-subst">></span> <span class="hljs-number">172.20</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>: ICMP echo request, id <span class="hljs-number">47671</span>, seq <span class="hljs-number">0</span>, length <span class="hljs-number">64</span>
<span class="hljs-number">22</span>:<span class="hljs-number">35</span>:<span class="hljs-number">38.210183</span> IP <span class="hljs-number">172.20</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span> <span class="hljs-subst">></span> <span class="hljs-number">172.20</span><span class="hljs-number">.0</span><span class="hljs-number">.2</span>: ICMP echo reply, id <span class="hljs-number">47671</span>, seq <span class="hljs-number">0</span>, length <span class="hljs-number">64</span></code></pre>
<p>You can sort up the four packets by their send time:</p>
<pre class="prettyprint"><code class=" hljs livecodeserver"><span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.2</span> > <span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>, ICMP request <span class="hljs-command"><span class="hljs-keyword">on</span> <span class="hljs-title">tunA</span></span>
< transfer <span class="hljs-built_in">from</span> tunA <span class="hljs-built_in">to</span> tunB >
<span class="hljs-number">172.20</span><span class="hljs-number">.0</span><span class="hljs-number">.2</span> > <span class="hljs-number">172.20</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>, ICMP request <span class="hljs-command"><span class="hljs-keyword">on</span> <span class="hljs-title">tunB</span></span>
< <span class="hljs-keyword">system</span> replies <span class="hljs-built_in">to</span> ICMP ping >
<span class="hljs-number">172.20</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span> > <span class="hljs-number">172.20</span><span class="hljs-number">.0</span><span class="hljs-number">.2</span>, ICMP reply <span class="hljs-command"><span class="hljs-keyword">on</span> <span class="hljs-title">tunB</span></span>
< transfer <span class="hljs-built_in">from</span> tunB <span class="hljs-built_in">to</span> tunA >
<span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span> > <span class="hljs-number">172.19</span><span class="hljs-number">.0</span><span class="hljs-number">.2</span>, ICMP reply <span class="hljs-command"><span class="hljs-keyword">on</span> <span class="hljs-title">tunB</span></span></code></pre>
<p>In this lab, <strong>Alice</strong> should communicate with <strong>tunA</strong> only, and <strong>Bob</strong> should communicate with <strong>tunB</strong> only. They are not allowed to communicate directly. Direct connection will be restricted on testing by TA. They can use any transfer layer protocol on <strong>tunA</strong> and <strong>tunB</strong> such as <strong>TCP</strong>, <strong>UDP</strong>, <strong>ICMP</strong>. The transfer program will emulate latency and packet loss on <strong>tunA</strong> and <strong>tunB</strong>.</p>
<h2 id="environment-setting-up">Environment setting up</h2>
<p>You can finish this lab on <strong>Linux</strong>, or <strong>OSX</strong>, or <strong>Windows</strong>. Just choose the platform you want.</p>
<p>First, fetch the material from:</p>
<pre class="prettyprint"><code class=" hljs avrasm"><span class="hljs-label">https:</span>//git<span class="hljs-preprocessor">.oschina</span><span class="hljs-preprocessor">.net</span>/nullmdr/network-pj1</code></pre>
<p>Or you can</p>
<pre class="prettyprint"><code class=" hljs avrasm">git clone https://git<span class="hljs-preprocessor">.oschina</span><span class="hljs-preprocessor">.net</span>/nullmdr/network-pj1<span class="hljs-preprocessor">.git</span></code></pre>
<p>This lab provides the transfer program with a <strong>CMakeFiles</strong>. It’s a cross platform build script. I’ve built the binary for you in <code>Release</code> Folder. However some extra steps are needed for some platforms.</p>
<h3 id="linux">Linux</h3>
<p>Launch the binary with <code>sudo</code>:</p>
<pre class="prettyprint"><code class=" hljs lasso">$ sudo <span class="hljs-built_in">.</span>/Release/transfer<span class="hljs-attribute">-linux</span> <span class="hljs-attribute">-h</span></code></pre>
<h3 id="mac-osx">Mac OSX</h3>
<p>You need to install <strong>tuntaposx</strong> from:</p>
<pre class="prettyprint"><code class=" hljs avrasm"><span class="hljs-label">http:</span>//tuntaposx<span class="hljs-preprocessor">.sourceforge</span><span class="hljs-preprocessor">.net</span>/download<span class="hljs-preprocessor">.xhtml</span></code></pre>
<p>Then, launch the binary with <code>sudo</code>:</p>
<pre class="prettyprint"><code class=" hljs lasso">$ sudo <span class="hljs-built_in">.</span>/Release/transfer<span class="hljs-attribute">-osx</span> <span class="hljs-attribute">-t</span> <span class="hljs-number">10</span></code></pre>
<p>If you have issue about root permission, see:</p>
<pre class="prettyprint"><code class=" hljs livecodeserver"><span class="hljs-keyword">http</span>://osxdaily.com/<span class="hljs-number">2015</span>/<span class="hljs-number">10</span>/<span class="hljs-number">05</span>/disable-rootless-<span class="hljs-keyword">system</span>-integrity-protection-mac-os-x/</code></pre>
<h3 id="windows">Windows</h3>
<p>You need to install <strong>tap-windows</strong>. In <code>tap-win64</code> folder, run <code>addtap.bat</code>. Then, go to <code>Control Pannel - Network and Sharing Center - Change adapter settings</code>, rename the names of the two added <strong>TAP-win32</strong> adapter: rename <strong>#2</strong> to <strong>tunA</strong>, rename the other to <strong>tunB</strong>.</p>
<p>Then, launch the admin shell via <code>Release/windows-run.bat</code>. Launch <strong>transfer</strong> in the admin shell:</p>
<pre class="prettyprint"><code class=" hljs bash">> transfer <span class="hljs-operator">-l</span> <span class="hljs-number">100</span></code></pre>
<h4 id="tips">Tips:</h4>
<p>The <strong>tap-windows</strong> is a component of <strong>OPENVPN</strong>. You can download it (not required for this lab) on</p>
<pre class="prettyprint"><code class=" hljs avrasm"><span class="hljs-label">https:</span>//openvpn<span class="hljs-preprocessor">.net</span>/index<span class="hljs-preprocessor">.php</span>/open-source/downloads<span class="hljs-preprocessor">.html</span></code></pre>
<p><strong>tap-windows</strong> install binary is at the bottom of the page. <strong>Notice</strong>: This lab requires two tun devices, so you need to manually install one in addiction after the installation if you want to install it from the <strong>OPENVPN</strong> website.</p>
<h2 id="how-to-start-this-lab">How to start this lab</h2>
<h3 id="run-download-test">Run download test</h3>
<p>First, you need a HTTP server for speed test. You can use nginx. In fact you can use any http server you like. I suggest nginx with the following configuration</p>
<pre class="prettyprint"><code class=" hljs applescript">worker_processes <span class="hljs-number">4</span>;
events {
worker_connections <span class="hljs-number">1024</span>;
}
http {
include mime.types;
default_type <span class="hljs-type">application</span>/octet-stream;
sendfile <span class="hljs-function_start"><span class="hljs-keyword">on</span></span>;
keepalive_timeout <span class="hljs-number">65</span>;
server {
<span class="hljs-comment"># Change it to 127.0.0.1:8000 after finishing this lab</span>
listen <span class="hljs-number">8000</span>;
location / {
<span class="hljs-comment"># Change it to your test dir</span>
root html;
}
}
}</code></pre>
<p>Then, in the test dir, generate a 100M test file (Windows user can use <strong>Cygwin</strong> or <strong>MinGW</strong>)</p>
<pre class="prettyprint"><code class=" hljs ruby"><span class="hljs-variable">$ </span>dd <span class="hljs-keyword">if</span>=<span class="hljs-regexp">/dev/urandom</span> of=<span class="hljs-number">100</span>M bs=<span class="hljs-number">1</span>M count=<span class="hljs-number">100</span></code></pre>
<p>For Mac OSX, you need to change <code>bs=1M</code> to <code>bs=1m</code>.</p>
<p>After <strong>nginx</strong> and <strong>transfer</strong> running up, you can test the transfer bridge</p>
<pre class="prettyprint"><code class=" hljs ruby"><span class="hljs-variable">$ </span>wget <span class="hljs-number">172.19</span>.<span class="hljs-number">0</span>.<span class="hljs-number">1</span><span class="hljs-symbol">:</span><span class="hljs-number">8000</span>/<span class="hljs-number">100</span>M -<span class="hljs-constant">O</span> <span class="hljs-number">100</span>M.test
<span class="hljs-variable">$ </span>diff <span class="hljs-number">100</span>M <span class="hljs-number">100</span>M.test</code></pre>
<p>After you finishing up this lab, you can test it in several ways</p>
<pre class="prettyprint"><code class=" hljs ruby"><span class="hljs-variable">$ </span>dd <span class="hljs-keyword">if</span>=<span class="hljs-regexp">/dev/urandom</span> of=<span class="hljs-number">1</span>G bs=<span class="hljs-number">1</span>M count=<span class="hljs-number">1024</span>
<span class="hljs-variable">$ </span>wget <span class="hljs-number">127.0</span>.<span class="hljs-number">0</span>.<span class="hljs-number">1</span><span class="hljs-symbol">:</span><span class="hljs-number">7000</span>/<span class="hljs-number">1</span>G -<span class="hljs-constant">O</span> <span class="hljs-number">1</span>G.test
<span class="hljs-variable">$ </span>diff <span class="hljs-number">1</span>G <span class="hljs-number">1</span>G.test
<span class="hljs-constant">Test</span> <span class="hljs-keyword">for</span> multi thread downloading
<span class="hljs-variable">$ </span>axel -n <span class="hljs-number">64</span> <span class="hljs-number">127.0</span>.<span class="hljs-number">0</span>.<span class="hljs-number">1</span><span class="hljs-symbol">:</span><span class="hljs-number">7000</span>/<span class="hljs-number">1</span>G -<span class="hljs-constant">O</span> <span class="hljs-number">1</span>G.test
<span class="hljs-variable">$ </span>mwget -n=<span class="hljs-number">128</span> <span class="hljs-number">127.0</span>.<span class="hljs-number">0</span>.<span class="hljs-number">1</span><span class="hljs-symbol">:</span><span class="hljs-number">7000</span>/<span class="hljs-number">1</span>G -<span class="hljs-constant">O</span> <span class="hljs-number">1</span>G.test</code></pre>
<h3 id="tcp-connection-proxy">TCP Connection Proxy</h3>
<p>This lab requires you to implement a TCP connection proxy in this lab. <strong>Alice</strong> should listen on 127.0.0.1:7000, and <strong>Bob</strong> should proxy all the connection to 127.0.0.1:8000. They communicate via tunA and tunB, or, <strong>Alice</strong> should only listen on 172.19.0.2 and send packet to 172.19.0.1, while <strong>Bob</strong> should only listen on 172.20.0.1 and send packet to 172.20.0.2. The address in the packet will be translated by <strong>transfer</strong>. Afterward <strong>transfer</strong> will send the transformed packet to the other tun interface. You can assume that for <strong>Alice</strong>, <strong>Bob</strong> is on 172.19.0.1; for <strong>Bob</strong>, <strong>Alice</strong> is on 172.20.0.2.</p>
<p>They <em>should</em> work correctly under multithread downloading. Use <strong>diff</strong> to check the correctness of data transfer. </p>
<h3 id="tcp-congestion-control-algorithms">TCP Congestion Control Algorithms</h3>
<p><strong>transfer</strong> can emulate a high latency, high packet loss rate network. As you can see, the system’s default congestion control algorithm doesn’t work well in this situation. <strong>You need to implement a congestion control algorithm in this lab.</strong> Maybe you can start up here:</p>
<pre class="prettyprint"><code class=" hljs avrasm"><span class="hljs-label">https:</span>//en<span class="hljs-preprocessor">.wikipedia</span><span class="hljs-preprocessor">.org</span>/wiki/TCP_congestion_control<span class="hljs-preprocessor">#Algorithms</span></code></pre>
<p>You can try different algorithms, benchmark them, choose the best one, or implement one yourself.</p>
<h3 id="coding">Coding</h3>
<p>This lab doesn’t limit the platform or programming language you use. Please write down how to build your program in README. Add your test platform, compiler version and computer configuration to README, too. <br>
Describe how do you implement this lab (e.g. which algorithm to use, why) in README.</p>
<p>MarkDown or PDF format is preferred for README. Please submit all of your source code and your README doc to ftp before due. Make a tarball or zip file like <code>13302010023_何天成.tar.gz</code> before submission.</p>
<h3 id="testing-and-grading">Testing and Grading</h3>
<h4 id="30">30%</h4>
<p>Sanity test. Your code should work correctly for single-thread and multi-thread downloading. Download speed should reach and keep at least 75% of the limit speed (option <code>-l</code>) with no delay and packet loss.</p>
<h4 id="70">70%</h4>
<p>Performance test. Your code will be tested under vary of configurations. Limit: delay will not exceed 300ms (rtt ~600ms), speed limit will not exceed 100Mbps, delay thrashing will not exceed 50%, packet loss rate: ???SECRET <br>
The one wins the best performance will get full score in this part. The others’ scores are based on their code’s performance and the best performance of all.</p>
<h2 id="how-to-build-the-transfer-program">How to build the transfer program</h2>
<p>If you have trouble running the binary, or maybe you are interested in how to build the binary, here is the instruction:</p>
<h3 id="linux-1">Linux</h3>
<p>Install <strong>cmake</strong>. If you are using <strong>Ubuntu</strong>:</p>
<pre class="prettyprint"><code class=" hljs bash">$ <span class="hljs-built_in">sudo</span> apt-get install cmake</code></pre>
<p>Then, you can build the program</p>
<pre class="prettyprint"><code class=" hljs ruby"><span class="hljs-variable">$ </span>cmake .
<span class="hljs-variable">$ </span>make</code></pre>
<h3 id="mac-osx-1">Mac OSX</h3>
<p>Install build toolchain:</p>
<pre class="prettyprint"><code class=" hljs lua">$ xcode-<span class="hljs-built_in">select</span> <span class="hljs-comment">--install</span></code></pre>
<p>Install <strong>cmake</strong> via <strong>homebrew</strong>:</p>
<pre class="prettyprint"><code class=" hljs bash">$ /usr/bin/ruby <span class="hljs-operator">-e</span> <span class="hljs-string">"<span class="hljs-variable">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span>
$ brew install cmake</code></pre>
<p>Then, build:</p>
<pre class="prettyprint"><code class=" hljs ruby"><span class="hljs-variable">$ </span>cmake .
<span class="hljs-variable">$ </span>make</code></pre>
<h3 id="windows-1">Windows</h3>
<p>Install <strong>cmake</strong></p>
<pre class="prettyprint"><code class=" hljs avrasm"><span class="hljs-label">https:</span>//cmake<span class="hljs-preprocessor">.org</span>/</code></pre>
<p>Install <strong>Visual Studio 2015</strong></p>
<pre class="prettyprint"><code class=" hljs avrasm"><span class="hljs-label">http:</span>//mvls<span class="hljs-preprocessor">.fudan</span><span class="hljs-preprocessor">.edu</span><span class="hljs-preprocessor">.cn</span>/develope%<span class="hljs-number">20</span>tools/SW_DVD9_NTRL_Visual_Studio_Ent_2015_ChnSimp_FPP_VL_MLF_X20-<span class="hljs-number">29937.</span>ISO</code></pre>
<p>Build in <strong>VS2015 MSBuild Command-line</strong></p>
<pre class="prettyprint"><code class=" hljs markdown"><span class="hljs-blockquote">> cmake .</span>
<span class="hljs-blockquote">> msbuild ALL_BUILD.vcxproj /p:Configuration=Release</span></code></pre></div></body>
</html>