1
0
Fork 0
cl-sites/w3.cs.jmu.edu/kirkpams/OpenCSF/Books/csf/html/Extended5DNS.html

739 lines
52 KiB
HTML
Raw Normal View History

2025-01-28 10:11:14 +01:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>5.8. Extended Example: DNS Client &mdash; Computer Systems Fundamentals</title>
<link rel="stylesheet" href="_static/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous" />
<link rel="stylesheet" href="_static/css/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/normalize.css" type="text/css" />
<link rel="stylesheet" href="../../../JSAV/css/JSAV.css" type="text/css" />
<link rel="stylesheet" href="../../../lib/odsaMOD-min.css" type="text/css" />
<link rel="stylesheet" href="_static/css/jquery-1.11.4-smoothness-ui.css" type="text/css" />
<link rel="stylesheet" href="../../../lib/odsaStyle-min.css" type="text/css" />
<link rel="stylesheet" href="_static/css/csf.css" type="text/css" />
<style>
.underline { text-decoration: underline; }
</style>
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '0.4.1',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
inlineMath: [['$','$'], ['\\(','\\)']],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
processEscapes: true
},
"HTML-CSS": {
scale: "80"
}
});
</script>
<link rel="shortcut icon" href="_static/favicon.ico"/>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="index" title="Computer Systems Fundamentals" href="index.html" />
<link rel="next" title="1. Concurrency with Multithreading" href="ThreadsOverview.html" />
<link rel="prev" title="7. Wireless Connectivity: Wi-Fi, Bluetooth, and Zigbee" href="Wireless.html" />
</head><body>
<nav class="navbar navbar-expand-md navbar-dark navbar-custom fixed-top">
<a class="navbar-brand py-0" href="index.html"><img src="_static/CSF-Logo-Square-Text.png" alt="OpenCSF Logo" height="40em" class="py-1 px-2 mb-0 align-center rounded-lg bg-white" /></a>
<!-- Show a navbar toggler on mobile -->
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#defaultNavbars" aria-controls="defaultNavbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="defaultNavbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle jmu-gold rounded" href="Extended5DNS.html#" id="navbarDropdownChapters" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Contents</a>
<div class="dropdown-menu scrollable-menu" role="menu" aria-labelledby="navbarDropdownChapters">
<a class="dropdown-item" tabindex="-1" href="Extended5DNS.html#"><b>Chapter 1</b></a>
<a class="dropdown-item" href="IntroConcSysOverview.html">&nbsp;&nbsp;&nbsp;1.1. Introduction to Concurrent Systems</a>
<a class="dropdown-item" href="SysAndModels.html">&nbsp;&nbsp;&nbsp;1.2. Systems and Models</a>
<a class="dropdown-item" href="Themes.html">&nbsp;&nbsp;&nbsp;1.3. Themes and Guiding Principles</a>
<a class="dropdown-item" href="Architectures.html">&nbsp;&nbsp;&nbsp;1.4. System Architectures</a>
<a class="dropdown-item" href="StateModels.html">&nbsp;&nbsp;&nbsp;1.5. State Models in UML</a>
<a class="dropdown-item" href="SequenceModels.html">&nbsp;&nbsp;&nbsp;1.6. Sequence Models in UML</a>
<a class="dropdown-item" href="StateModelImplementation.html">&nbsp;&nbsp;&nbsp;1.7. Extended Example: State Model Implementation</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item disabled"><b>Chapter 2</b></a>
<a class="dropdown-item" href="ProcessesOverview.html">&nbsp;&nbsp;&nbsp;2.1. Processes and OS Basics</a>
<a class="dropdown-item" href="Multiprogramming.html">&nbsp;&nbsp;&nbsp;2.2. Processes and Multiprogramming</a>
<a class="dropdown-item" href="KernelMechanics.html">&nbsp;&nbsp;&nbsp;2.3. Kernel Mechanics</a>
<a class="dropdown-item" href="Syscall.html">&nbsp;&nbsp;&nbsp;2.4. System Call Interface</a>
<a class="dropdown-item" href="ProcessCycle.html">&nbsp;&nbsp;&nbsp;2.5. Process Life Cycle</a>
<a class="dropdown-item" href="UnixFile.html">&nbsp;&nbsp;&nbsp;2.6. The UNIX File Abstraction</a>
<a class="dropdown-item" href="EventsSignals.html">&nbsp;&nbsp;&nbsp;2.7. Events and Signals</a>
<a class="dropdown-item" href="Extended2Processes.html">&nbsp;&nbsp;&nbsp;2.8. Extended Example: Listing Files with Processes</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item disabled"><b>Chapter 3</b></a>
<a class="dropdown-item" href="IPCOverview.html">&nbsp;&nbsp;&nbsp;3.1. Concurrency with IPC</a>
<a class="dropdown-item" href="IPCModels.html">&nbsp;&nbsp;&nbsp;3.2. IPC Models</a>
<a class="dropdown-item" href="Pipes.html">&nbsp;&nbsp;&nbsp;3.3. Pipes and FIFOs</a>
<a class="dropdown-item" href="MMap.html">&nbsp;&nbsp;&nbsp;3.4. Shared Memory With Memory-mapped Files</a>
<a class="dropdown-item" href="POSIXvSysV.html">&nbsp;&nbsp;&nbsp;3.5. POSIX vs. System V IPC</a>
<a class="dropdown-item" href="MQueues.html">&nbsp;&nbsp;&nbsp;3.6. Message Passing With Message Queues</a>
<a class="dropdown-item" href="ShMem.html">&nbsp;&nbsp;&nbsp;3.7. Shared Memory</a>
<a class="dropdown-item" href="IPCSems.html">&nbsp;&nbsp;&nbsp;3.8. Semaphores</a>
<a class="dropdown-item" href="Extended3Bash.html">&nbsp;&nbsp;&nbsp;3.9. Extended Example: Bash-lite: A Simple Command-line Shell</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item disabled"><b>Chapter 4</b></a>
<a class="dropdown-item" href="SocketsOverview.html">&nbsp;&nbsp;&nbsp;4.1. Networked Concurrency</a>
<a class="dropdown-item" href="FiveLayer.html">&nbsp;&nbsp;&nbsp;4.2. The TCP/IP Internet Model</a>
<a class="dropdown-item" href="NetApps.html">&nbsp;&nbsp;&nbsp;4.3. Network Applications and Protocols</a>
<a class="dropdown-item" href="Sockets.html">&nbsp;&nbsp;&nbsp;4.4. The Socket Interface</a>
<a class="dropdown-item" href="TCPSockets.html">&nbsp;&nbsp;&nbsp;4.5. TCP Socket Programming: HTTP</a>
<a class="dropdown-item" href="UDPSockets.html">&nbsp;&nbsp;&nbsp;4.6. UDP Socket Programming: DNS</a>
<a class="dropdown-item" href="AppBroadcast.html">&nbsp;&nbsp;&nbsp;4.7. Application-Layer Broadcasting: DHCP</a>
<a class="dropdown-item" href="Extended4CGI.html">&nbsp;&nbsp;&nbsp;4.8. Extended Example: CGI Web Server</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item disabled"><b>Chapter 5</b></a>
<a class="dropdown-item" href="InternetOverview.html">&nbsp;&nbsp;&nbsp;5.1. The Internet and Connectivity</a>
<a class="dropdown-item" href="AppLayer.html">&nbsp;&nbsp;&nbsp;5.2. Application Layer: Overlay Networks</a>
<a class="dropdown-item" href="TransLayer.html">&nbsp;&nbsp;&nbsp;5.3. Transport Layer</a>
<a class="dropdown-item" href="NetSec.html">&nbsp;&nbsp;&nbsp;5.4. Network Security Fundamentals</a>
<a class="dropdown-item" href="NetLayer.html">&nbsp;&nbsp;&nbsp;5.5. Network Layer: IP</a>
<a class="dropdown-item" href="LinkLayer.html">&nbsp;&nbsp;&nbsp;5.6. Link Layer</a>
<a class="dropdown-item" href="Wireless.html">&nbsp;&nbsp;&nbsp;5.7. Wireless Connectivity: Wi-Fi, Bluetooth, and Zigbee</a>
<a class="dropdown-item" href="Extended5DNS.html">&nbsp;&nbsp;&nbsp;5.8. Extended Example: DNS client</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item disabled"><b>Chapter 6</b></a>
<a class="dropdown-item" href="ThreadsOverview.html">&nbsp;&nbsp;&nbsp;6.1. Concurrency with Multithreading</a>
<a class="dropdown-item" href="ProcVThreads.html">&nbsp;&nbsp;&nbsp;6.2. Processes vs. Threads</a>
<a class="dropdown-item" href="RaceConditions.html">&nbsp;&nbsp;&nbsp;6.3. Race Conditions and Critical Sections</a>
<a class="dropdown-item" href="POSIXThreads.html">&nbsp;&nbsp;&nbsp;6.4. POSIX Thread Library</a>
<a class="dropdown-item" href="ThreadArgs.html">&nbsp;&nbsp;&nbsp;6.5. Thread Arguments and Return Values</a>
<a class="dropdown-item" href="ImplicitThreads.html">&nbsp;&nbsp;&nbsp;6.6. Implicit Threading and Language-based Threads</a>
<a class="dropdown-item" href="Extended6Input.html">&nbsp;&nbsp;&nbsp;6.7. Extended Example: Keyboard Input Listener</a>
<a class="dropdown-item" href="Extended6Primes.html">&nbsp;&nbsp;&nbsp;6.8. Extended Example: Concurrent Prime Number Search</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item disabled"><b>Chapter 7</b></a>
<a class="dropdown-item" href="SynchOverview.html">&nbsp;&nbsp;&nbsp;7.1. Synchronization Primitives</a>
<a class="dropdown-item" href="CritSect.html">&nbsp;&nbsp;&nbsp;7.2. Critical Sections and Peterson's Solution</a>
<a class="dropdown-item" href="Locks.html">&nbsp;&nbsp;&nbsp;7.3. Locks</a>
<a class="dropdown-item" href="Semaphores.html">&nbsp;&nbsp;&nbsp;7.4. Semaphores</a>
<a class="dropdown-item" href="Barriers.html">&nbsp;&nbsp;&nbsp;7.5. Barriers</a>
<a class="dropdown-item" href="Condvars.html">&nbsp;&nbsp;&nbsp;7.6. Condition Variables</a>
<a class="dropdown-item" href="Deadlock.html">&nbsp;&nbsp;&nbsp;7.7. Deadlock</a>
<a class="dropdown-item" href="Extended7Events.html">&nbsp;&nbsp;&nbsp;7.8. Extended Example: Event Log File</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item disabled"><b>Chapter 8</b></a>
<a class="dropdown-item" href="SynchProblemsOverview.html">&nbsp;&nbsp;&nbsp;8.1. Synchronization Patterns and Problems</a>
<a class="dropdown-item" href="SynchDesign.html">&nbsp;&nbsp;&nbsp;8.2. Basic Synchronization Design Patterns</a>
<a class="dropdown-item" href="ProdCons.html">&nbsp;&nbsp;&nbsp;8.3. Producer-Consumer Problem</a>
<a class="dropdown-item" href="ReadWrite.html">&nbsp;&nbsp;&nbsp;8.4. Readers-Writers Problem</a>
<a class="dropdown-item" href="DiningPhil.html">&nbsp;&nbsp;&nbsp;8.5. Dining Philosophers Problem and Deadlock</a>
<a class="dropdown-item" href="CigSmokers.html">&nbsp;&nbsp;&nbsp;8.6. Cigarette Smokers Problem and the Limits of Semaphores and Locks</a>
<a class="dropdown-item" href="Extended8ModExp.html">&nbsp;&nbsp;&nbsp;8.7. Extended Example: Parallel Modular Exponentiation</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item disabled"><b>Chapter 9</b></a>
<a class="dropdown-item" href="ParallelDistributedOverview.html">&nbsp;&nbsp;&nbsp;9.1. Parallel and Distributed Systems</a>
<a class="dropdown-item" href="ParVConc.html">&nbsp;&nbsp;&nbsp;9.2. Parallelism vs. Concurrency</a>
<a class="dropdown-item" href="ParallelDesign.html">&nbsp;&nbsp;&nbsp;9.3. Parallel Design Patterns</a>
<a class="dropdown-item" href="Scaling.html">&nbsp;&nbsp;&nbsp;9.4. Limits of Parallelism and Scaling</a>
<a class="dropdown-item" href="DistTiming.html">&nbsp;&nbsp;&nbsp;9.5. Timing in Distributed Environments</a>
<a class="dropdown-item" href="DistDataStorage.html">&nbsp;&nbsp;&nbsp;9.6. Reliable Data Storage and Location</a>
<a class="dropdown-item" href="DistConsensus.html">&nbsp;&nbsp;&nbsp;9.7. Consensus in Distributed Systems</a>
<a class="dropdown-item" href="Extended9Blockchain.html">&nbsp;&nbsp;&nbsp;9.8. Extended Example: Blockchain Proof-of-Work</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item disabled"><b>Appendix A</b></a>
<a class="dropdown-item" href="CLangOverview.html">&nbsp;&nbsp;&nbsp;A.1. C Language Reintroduction</a>
<a class="dropdown-item" href="Debugging.html">&nbsp;&nbsp;&nbsp;A.2. Documentation and Debugging</a>
<a class="dropdown-item" href="BasicTypes.html">&nbsp;&nbsp;&nbsp;A.3. Basic Types and Pointers</a>
<a class="dropdown-item" href="Arrays.html">&nbsp;&nbsp;&nbsp;A.4. Arrays, Structs, Enums, and Type Definitions</a>
<a class="dropdown-item" href="Functions.html">&nbsp;&nbsp;&nbsp;A.5. Functions and Scope</a>
<a class="dropdown-item" href="Pointers.html">&nbsp;&nbsp;&nbsp;A.6. Pointers and Dynamic Allocation</a>
<a class="dropdown-item" href="Strings.html">&nbsp;&nbsp;&nbsp;A.7. Strings</a>
<a class="dropdown-item" href="FunctionPointers.html">&nbsp;&nbsp;&nbsp;A.8. Function Pointers</a>
<a class="dropdown-item" href="Files.html">&nbsp;&nbsp;&nbsp;A.9. Files</a>
</div>
</li>
</ul>
</div>
<ul class="navbar-nav flex-row ml-md-auto d-none d-md-flex">
<li class="nav-item"><a class="nav-link jmu-gold" href="https://w3.cs.jmu.edu/kirkpams/OpenCSF/Books/csf/source/Extended5DNS.rst"
target="_blank" rel="nofollow">Show Source</a></li>
</ul>
</nav>
<div class="container center">
«&#160;&#160;<a id="prevmod" href="Wireless.html">5.7. Wireless Connectivity: Wi-Fi, Bluetooth, and Zigbee</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
&#160;&#160;::&#160;&#160;
<a id="nextmod" href="ThreadsOverview.html">6.1. Concurrency with Multithreading</a>&#160;&#160;»
</div>
<br />
<script type="text/javascript" src="_static/js/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/javascript" src="_static/js/jquery-1.11.4-ui.min.js"></script>
<script type="text/javascript" src="_static/js/forge-0.7.0.min.js"></script>
<script type="text/javascript" src="../../../JSAV/lib/jquery.transit.js"></script>
<script type="text/javascript" src="../../../JSAV/lib/raphael.js"></script>
<script type="text/javascript" src="../../../JSAV/build/JSAV-min.js"></script>
<script type="text/javascript" src="_static/js/config.js"></script>
<script type="text/javascript" src="../../../lib/odsaUtils-min.js"></script>
<script type="text/javascript" src="../../../lib/odsaMOD-min.js"></script>
<script type="text/javascript" src="_static/js/d3-4.13.0.min.js"></script>
<script type="text/javascript" src="_static/js/d3-selection-multi.v1.min.js"></script>
<script type="text/javascript" src="../../../lib/dataStructures.js"></script>
<div class="container">
<script>ODSA.SETTINGS.DISP_MOD_COMP = true;ODSA.SETTINGS.MODULE_NAME = "Extended5DNS";ODSA.SETTINGS.MODULE_LONG_NAME = "Extended Example: DNS Client";ODSA.SETTINGS.MODULE_CHAPTER = "The Internet and Connectivity"; ODSA.SETTINGS.BUILD_DATE = "2021-06-14 17:15:25"; ODSA.SETTINGS.BUILD_CMAP = false;JSAV_OPTIONS['lang']='en';JSAV_EXERCISE_OPTIONS['code']='java';</script><div class="section" id="extended-example-dns-client">
<h1>5.8. Extended Example: DNS Client<a class="headerlink" href="Extended5DNS.html#extended-example-dns-client" title="Permalink to this headline"></a></h1>
<p>This Extended Example is a minimal client for performing a DNS query for IPv4
addresses. Given a domain name (such as <code class="docutils literal notranslate"><span class="pre">example.com</span></code>), the client sets up
the DNS question in <code class="docutils literal notranslate"><span class="pre">setup_dns_request()</span></code> (lines 200 234). The <code class="docutils literal notranslate"><span class="pre">packed</span></code>
attribute of the <code class="docutils literal notranslate"><span class="pre">dns_record_a_t</span></code> (lines 31 39) ensures that the compiler
does not add any unnecessary padding that would make the question improperly
structured. The <code class="docutils literal notranslate"><span class="pre">build_domain_qname()</span></code> function (lines 95 134) replaces the
dots in the domain name with an integer to denote the length of the next field.
Lines 65 82 perform the actual query, sending the request to OpenDNS using a
UDP socket. The client is only designed to support DNS <code class="docutils literal notranslate"><span class="pre">A</span></code> type records for
IPv4. I.e., this client does not support <code class="docutils literal notranslate"><span class="pre">CNAME</span></code>, <code class="docutils literal notranslate"><span class="pre">NS</span></code>, or <code class="docutils literal notranslate"><span class="pre">MX</span></code> records.
The <code class="docutils literal notranslate"><span class="pre">print_dns_response()</span></code> function (lines 153 198) will stop if any other
record types are encountered.</p>
<div class="highlight-c border border-dark rounded-lg bg-light px-0 mb-3 notranslate"><table class="highlighttable"><tr><td class="linenos px-0 mx-0"><div class="linenodiv"><pre class="mb-0"> 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</pre></div></td><td class="code"><div class="highlight bg-light"><pre class="mb-0"><span></span><span class="cp">#include</span> <span class="cpf">&lt;arpa/inet.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;assert.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;inttypes.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;netdb.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;netinet/in.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;stdint.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;stdint.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp"></span>
<span class="cm">/* Structure of the bytes for a DNS header */</span>
<span class="k">typedef</span> <span class="k">struct</span> <span class="p">{</span>
<span class="kt">uint16_t</span> <span class="n">xid</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">flags</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">qdcount</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">ancount</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">nscount</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">arcount</span><span class="p">;</span>
<span class="p">}</span> <span class="n">dns_header_t</span><span class="p">;</span>
<span class="cm">/* Structure of the bytes for a DNS question */</span>
<span class="k">typedef</span> <span class="k">struct</span>
<span class="p">{</span>
<span class="kt">char</span> <span class="o">*</span><span class="n">name</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">dnstype</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">dnsclass</span><span class="p">;</span>
<span class="p">}</span> <span class="n">dns_question_t</span><span class="p">;</span>
<span class="cm">/* Structure of the bytes for an IPv4 answer */</span>
<span class="k">typedef</span> <span class="k">struct</span> <span class="p">{</span>
<span class="kt">uint16_t</span> <span class="n">compression</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">type</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">class</span><span class="p">;</span>
<span class="kt">uint32_t</span> <span class="n">ttl</span><span class="p">;</span>
<span class="kt">uint16_t</span> <span class="n">length</span><span class="p">;</span>
<span class="k">struct</span> <span class="n">in_addr</span> <span class="n">addr</span><span class="p">;</span>
<span class="p">}</span> <span class="n">__attribute__</span><span class="p">((</span><span class="n">packed</span><span class="p">))</span> <span class="n">dns_record_a_t</span><span class="p">;</span>
<span class="kt">char</span> <span class="o">*</span> <span class="nf">build_domain_qname</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">print_byte_block</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">,</span> <span class="kt">size_t</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">print_dns_response</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">);</span>
<span class="kt">uint8_t</span> <span class="o">*</span> <span class="nf">setup_dns_request</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">,</span> <span class="kt">size_t</span> <span class="o">*</span><span class="p">);</span>
<span class="kt">int</span>
<span class="nf">main</span> <span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">fprintf</span> <span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;ERROR: Must pass a domain name</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">char</span> <span class="o">*</span><span class="n">hostname</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
<span class="cm">/* Set up the packet and get the length */</span>
<span class="kt">size_t</span> <span class="n">packetlen</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="o">*</span><span class="n">packet</span> <span class="o">=</span> <span class="n">setup_dns_request</span> <span class="p">(</span><span class="n">hostname</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">packetlen</span><span class="p">);</span>
<span class="cm">/* Print the raw bytes formatted as 0000 0000 0000 ... */</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot;Lookup %s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">hostname</span><span class="p">);</span>
<span class="n">print_byte_block</span> <span class="p">(</span><span class="n">packet</span><span class="p">,</span> <span class="n">packetlen</span><span class="p">);</span>
<span class="cm">/* Send the packet to OpenDNS. Create an IPv4 UDP socket to</span>
<span class="cm"> 208.67.222.222 (0xd043dede), the IP address for OpenDNS.</span>
<span class="cm"> DNS servers listen on port 53. */</span>
<span class="kt">int</span> <span class="n">socketfd</span> <span class="o">=</span> <span class="n">socket</span> <span class="p">(</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">SOCK_DGRAM</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="k">struct</span> <span class="n">sockaddr_in</span> <span class="n">address</span><span class="p">;</span>
<span class="n">address</span><span class="p">.</span><span class="n">sin_family</span> <span class="o">=</span> <span class="n">AF_INET</span><span class="p">;</span>
<span class="n">address</span><span class="p">.</span><span class="n">sin_addr</span><span class="p">.</span><span class="n">s_addr</span> <span class="o">=</span> <span class="n">htonl</span> <span class="p">(</span><span class="mh">0xd043dede</span><span class="p">);</span>
<span class="n">address</span><span class="p">.</span><span class="n">sin_port</span> <span class="o">=</span> <span class="n">htons</span> <span class="p">(</span><span class="mi">53</span><span class="p">);</span>
<span class="cm">/* Send the request and get the response */</span>
<span class="n">sendto</span> <span class="p">(</span><span class="n">socketfd</span><span class="p">,</span> <span class="n">packet</span><span class="p">,</span> <span class="n">packetlen</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="k">struct</span> <span class="n">sockaddr</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">address</span><span class="p">,</span>
<span class="p">(</span><span class="kt">socklen_t</span><span class="p">)</span><span class="k">sizeof</span> <span class="p">(</span><span class="n">address</span><span class="p">));</span>
<span class="kt">socklen_t</span> <span class="n">length</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">response</span><span class="p">[</span><span class="mi">512</span><span class="p">];</span>
<span class="n">memset</span> <span class="p">(</span><span class="o">&amp;</span><span class="n">response</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">512</span><span class="p">);</span>
<span class="kt">ssize_t</span> <span class="n">bytes</span> <span class="o">=</span> <span class="n">recvfrom</span> <span class="p">(</span><span class="n">socketfd</span><span class="p">,</span> <span class="n">response</span><span class="p">,</span> <span class="mi">512</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
<span class="p">(</span><span class="k">struct</span> <span class="n">sockaddr</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">address</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">length</span><span class="p">);</span>
<span class="cm">/* Print the raw bytes formatted as 0000 0000 0000 ... */</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot;Received %zd bytes from %s:</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">bytes</span><span class="p">,</span>
<span class="n">inet_ntoa</span> <span class="p">(</span><span class="n">address</span><span class="p">.</span><span class="n">sin_addr</span><span class="p">));</span>
<span class="n">print_byte_block</span> <span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="n">bytes</span><span class="p">);</span>
<span class="cm">/* Parse the DNS response into a struct and print the result */</span>
<span class="n">print_dns_response</span> <span class="p">(</span><span class="n">response</span><span class="p">);</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">char</span> <span class="o">*</span>
<span class="nf">build_domain_qname</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">hostname</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">assert</span> <span class="p">(</span><span class="n">hostname</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">);</span>
<span class="kt">char</span> <span class="o">*</span><span class="n">name</span> <span class="o">=</span> <span class="n">calloc</span> <span class="p">(</span><span class="n">strlen</span> <span class="p">(</span><span class="n">hostname</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="k">sizeof</span> <span class="p">(</span><span class="kt">uint8_t</span><span class="p">));</span>
<span class="cm">/* Leave the first byte blank for the first field length */</span>
<span class="n">memcpy</span> <span class="p">(</span><span class="n">name</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">hostname</span><span class="p">,</span> <span class="n">strlen</span> <span class="p">(</span><span class="n">hostname</span><span class="p">));</span>
<span class="cm">/* Example:</span>
<span class="cm"> +---+---+---+---+---+---+---+---+---+---+---+</span>
<span class="cm"> | a | b | c | . | d | e | . | c | o | m | \0|</span>
<span class="cm"> +---+---+---+---+---+---+---+---+---+---+---+</span>
<span class="cm"> becomes:</span>
<span class="cm"> +---+---+---+---+---+---+---+---+---+---+---+---+</span>
<span class="cm"> | 3 | a | b | c | 2 | d | e | 3 | c | o | m | 0 |</span>
<span class="cm"> +---+---+---+---+---+---+---+---+---+---+---+---+</span>
<span class="cm"> */</span>
<span class="kt">uint8_t</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="o">*</span><span class="n">prev</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">)</span><span class="n">name</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">strlen</span> <span class="p">(</span><span class="n">hostname</span><span class="p">);</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="p">{</span>
<span class="cm">/* Look for the next ., then copy the length back to the</span>
<span class="cm"> location of the previous . */</span>
<span class="k">if</span> <span class="p">(</span><span class="n">hostname</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;.&#39;</span><span class="p">)</span>
<span class="p">{</span>
<span class="o">*</span><span class="n">prev</span> <span class="o">=</span> <span class="n">count</span><span class="p">;</span>
<span class="n">prev</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">)</span><span class="n">name</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="n">count</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span>
<span class="o">*</span><span class="n">prev</span> <span class="o">=</span> <span class="n">count</span><span class="p">;</span>
<span class="k">return</span> <span class="n">name</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span>
<span class="nf">print_byte_block</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">bytes</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">length</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">length</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot;%02x&quot;</span><span class="p">,</span> <span class="n">bytes</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="n">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="k">else</span> <span class="k">if</span> <span class="p">((</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="mi">16</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s"> &quot;</span><span class="p">);</span>
<span class="k">else</span> <span class="k">if</span> <span class="p">((</span><span class="n">i</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span>
<span class="nf">print_dns_response</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">response</span><span class="p">)</span>
<span class="p">{</span>
<span class="cm">/* First, check the header for an error response code */</span>
<span class="n">dns_header_t</span> <span class="o">*</span><span class="n">response_header</span> <span class="o">=</span> <span class="p">(</span><span class="n">dns_header_t</span> <span class="o">*</span><span class="p">)</span><span class="n">response</span><span class="p">;</span>
<span class="k">if</span> <span class="p">((</span><span class="n">ntohs</span> <span class="p">(</span><span class="n">response_header</span><span class="o">-&gt;</span><span class="n">flags</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xf</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">fprintf</span> <span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;Failed to get response</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="cm">/* Reconstruct the question */</span>
<span class="kt">uint8_t</span> <span class="o">*</span><span class="n">start_of_question</span> <span class="o">=</span> <span class="n">response</span> <span class="o">+</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">dns_header_t</span><span class="p">);</span>
<span class="n">dns_question_t</span> <span class="o">*</span><span class="n">questions</span>
<span class="o">=</span> <span class="n">calloc</span> <span class="p">(</span><span class="k">sizeof</span> <span class="p">(</span><span class="n">dns_question_t</span><span class="p">),</span> <span class="n">response_header</span><span class="o">-&gt;</span><span class="n">ancount</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">ntohs</span> <span class="p">(</span><span class="n">response_header</span><span class="o">-&gt;</span><span class="n">ancount</span><span class="p">);</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">questions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">name</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">start_of_question</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="n">total</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">uint8_t</span> <span class="o">*</span><span class="n">field_length</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">)</span><span class="n">questions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">name</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="o">*</span><span class="n">field_length</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">total</span> <span class="o">+=</span> <span class="o">*</span><span class="n">field_length</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="o">*</span><span class="n">field_length</span> <span class="o">=</span> <span class="sc">&#39;.&#39;</span><span class="p">;</span>
<span class="n">field_length</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">)</span><span class="n">questions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">name</span> <span class="o">+</span> <span class="n">total</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">questions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">name</span><span class="o">++</span><span class="p">;</span>
<span class="cm">/* Skip null byte, qtype, and qclass */</span>
<span class="n">start_of_question</span> <span class="o">=</span> <span class="n">field_length</span> <span class="o">+</span> <span class="mi">5</span><span class="p">;</span>
<span class="p">}</span>
<span class="cm">/* The records start right after the question section. For each record,</span>
<span class="cm"> confirm that it is an A record (only type supported). If any are not</span>
<span class="cm"> an A-type, then return. */</span>
<span class="n">dns_record_a_t</span> <span class="o">*</span><span class="n">records</span> <span class="o">=</span> <span class="p">(</span><span class="n">dns_record_a_t</span> <span class="o">*</span><span class="p">)</span><span class="n">start_of_question</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">ntohs</span> <span class="p">(</span><span class="n">response_header</span><span class="o">-&gt;</span><span class="n">ancount</span><span class="p">);</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot;Record for %s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">questions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">name</span><span class="p">);</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot; TYPE: %&quot;</span> <span class="n">PRId16</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ntohs</span> <span class="p">(</span><span class="n">records</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">type</span><span class="p">));</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot; CLASS: %&quot;</span> <span class="n">PRId16</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ntohs</span> <span class="p">(</span><span class="n">records</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">class</span><span class="p">));</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot; TTL: %&quot;</span> <span class="n">PRIx32</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ntohl</span> <span class="p">(</span><span class="n">records</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">ttl</span><span class="p">));</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot; IPv4: %08&quot;</span> <span class="n">PRIx32</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span>
<span class="n">ntohl</span> <span class="p">((</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">records</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">addr</span><span class="p">.</span><span class="n">s_addr</span><span class="p">));</span>
<span class="n">printf</span> <span class="p">(</span><span class="s">&quot; IPv4: %s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">inet_ntoa</span> <span class="p">(</span><span class="n">records</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">addr</span><span class="p">));</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">uint8_t</span> <span class="o">*</span>
<span class="nf">setup_dns_request</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">hostname</span><span class="p">,</span> <span class="kt">size_t</span> <span class="o">*</span><span class="n">packetlen</span><span class="p">)</span>
<span class="p">{</span>
<span class="cm">/* Set up the DNS header */</span>
<span class="n">dns_header_t</span> <span class="n">header</span><span class="p">;</span>
<span class="n">memset</span> <span class="p">(</span><span class="o">&amp;</span><span class="n">header</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">dns_header_t</span><span class="p">));</span>
<span class="n">header</span><span class="p">.</span><span class="n">xid</span><span class="o">=</span> <span class="n">htons</span> <span class="p">(</span><span class="mh">0x1234</span><span class="p">);</span> <span class="cm">/* Randomly chosen ID */</span>
<span class="n">header</span><span class="p">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">htons</span> <span class="p">(</span><span class="mh">0x0100</span><span class="p">);</span> <span class="cm">/* Q=0, RD=1 */</span>
<span class="n">header</span><span class="p">.</span><span class="n">qdcount</span> <span class="o">=</span> <span class="n">htons</span> <span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="cm">/* Sending 1 question */</span>
<span class="cm">/* Set up the DNS question */</span>
<span class="n">dns_question_t</span> <span class="n">question</span><span class="p">;</span>
<span class="n">question</span><span class="p">.</span><span class="n">dnstype</span> <span class="o">=</span> <span class="n">htons</span> <span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="cm">/* QTYPE 1=A */</span>
<span class="n">question</span><span class="p">.</span><span class="n">dnsclass</span> <span class="o">=</span> <span class="n">htons</span> <span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="cm">/* QCLASS 1=IN */</span>
<span class="n">question</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">build_domain_qname</span> <span class="p">(</span><span class="n">hostname</span><span class="p">);</span>
<span class="cm">/* Copy all fields into a single, concatenated packet */</span>
<span class="o">*</span><span class="n">packetlen</span> <span class="o">=</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">header</span><span class="p">)</span> <span class="o">+</span> <span class="n">strlen</span> <span class="p">(</span><span class="n">hostname</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span>
<span class="o">+</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">question</span><span class="p">.</span><span class="n">dnstype</span><span class="p">)</span> <span class="o">+</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">question</span><span class="p">.</span><span class="n">dnsclass</span><span class="p">);</span>
<span class="kt">uint8_t</span> <span class="o">*</span><span class="n">packet</span> <span class="o">=</span> <span class="n">calloc</span> <span class="p">(</span><span class="o">*</span><span class="n">packetlen</span><span class="p">,</span> <span class="k">sizeof</span> <span class="p">(</span><span class="kt">uint8_t</span><span class="p">));</span>
<span class="kt">uint8_t</span> <span class="o">*</span><span class="n">p</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">)</span><span class="n">packet</span><span class="p">;</span>
<span class="cm">/* Copy the header first */</span>
<span class="n">memcpy</span> <span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">header</span><span class="p">,</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">header</span><span class="p">));</span>
<span class="n">p</span> <span class="o">+=</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">header</span><span class="p">);</span>
<span class="cm">/* Copy the question name, QTYPE, and QCLASS fields */</span>
<span class="n">memcpy</span> <span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">question</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">strlen</span> <span class="p">(</span><span class="n">hostname</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span>
<span class="n">p</span> <span class="o">+=</span> <span class="n">strlen</span> <span class="p">(</span><span class="n">hostname</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span><span class="p">;</span>
<span class="n">memcpy</span> <span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">question</span><span class="p">.</span><span class="n">dnstype</span><span class="p">,</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">question</span><span class="p">.</span><span class="n">dnstype</span><span class="p">));</span>
<span class="n">p</span> <span class="o">+=</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">question</span><span class="p">.</span><span class="n">dnstype</span><span class="p">);</span>
<span class="n">memcpy</span> <span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">question</span><span class="p">.</span><span class="n">dnsclass</span><span class="p">,</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">question</span><span class="p">.</span><span class="n">dnsclass</span><span class="p">));</span>
<span class="k">return</span> <span class="n">packet</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
</div>
<div class="container">
<div class="mt-4 container center">
«&#160;&#160;<a id="prevmod1" href="Wireless.html">5.7. Wireless Connectivity: Wi-Fi, Bluetooth, and Zigbee</a>
&#160;&#160;::&#160;&#160;
<a class="uplink" href="index.html">Contents</a>
&#160;&#160;::&#160;&#160;
<a id="nextmod1" href="ThreadsOverview.html">6.1. Concurrency with Multithreading</a>&#160;&#160;»
</div>
</div>
<br />
<div class="row jmu-dark-purple-bg">
<div class="col-md-12">
<center>
<a id="contact_us" class="btn button-link-no-blue jmu-gold" rel="nofollow" href="mailto:webmaster@opencsf.org" role="button">Contact Us</a>
<a id="license" class="btn button-link-no-blue jmu-gold" rel="nofollow" href="https://w3.cs.jmu.edu/kirkpams/OpenCSF/lib/license.html" target="_blank">License</a>
</center>
</div>
</div>
<script src="_static/js/popper.js-1.14.7-min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="_static/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>
</html>