kathy870513 发表于 2011-12-22 08:53

C实现DNS ---转载

<DIV>
<DIV style="MARGIN: 15px" width="100%"><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">&nbsp;&nbsp; 转载地址:<A href="http://hubeihuyanwei.blog.163.com/blog/static/282052842008104115848444/" target=_blank>http://hubeihuyanwei.blog.163.com/blog/static/282052842008104115848444/</A></SPAN></DIV>
<DIV style="MARGIN: 15px" width="100%"><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">DNS</SPAN>(<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">Domain Name System</SPAN>)域名系统提供了主机名和IP地址之间的转换。通常我们在应用程序中使用库函数<SPAN style="FONT-WEIGHT: bold">gethostbyname()</SPAN>和<SPAN style="FONT-WEIGHT: bold">gethostbyaddr()</SPAN>来完成两者之间的转换。但是为了更深入的学习网络底层知识,有必要从源代码级别来分析和实现<BR><BR><A href="http://www.faqs.org/rfcs/rfc1034.html" target=_blank><FONT color=#000000>RFC 1034</FONT></A>说明了DNS的概念和功能,<A href="http://www.faqs.org/rfcs/rfc1035.html" target=_blank><FONT color=#000000>RFC 1035</FONT></A>详细说明了DNS的规范和实现。通过阅读RFC,我们知道明白了,应用程序对DNS的访问是通过解析器来(<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">resolver</SPAN>)完成的,解析器并不像TCP/IP协议那样是OS的内核,而是通过网络访问DNS服务器来得到名字和地址的对应关系。OS的TCP/IP协议簇对DNS一点都知道。<BR><BR>工欲善其事必先利其器,先得进行些基础知识的复习:<A href="http://faq.csdn.net/read/217043.html" target=_blank><FONT color=#000000>《bit与byte的区别》</FONT></A>和 《<A href="http://www.sn988.com/nzs/2006105205648.html" target=_blank><FONT color=#000000>bit与byte的联系》</FONT></A>及《<A href="http://www.programfan.com/article/2694.html" target=_blank><FONT color=#000000>位运算》</FONT></A>,一个int是4个byte(十六进制中<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">01 02 03 04</SPAN>转化为十进制为<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">16909060</SPAN>),一个char是1个byte(十六进制中<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">97</SPAN>转化为字符为<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">a</SPAN>)。例如在十六进制中<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">0x80</SPAN>,用bit来表示就是<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">1000 0000</SPAN>,此时如果我们对它实施位(<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">&gt;&gt;5</SPAN>)运算,得到的结果就是<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">0000 0100</SPAN>,十六进制值为<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">0x04</SPAN>。<BR><BR>在Linux的内核代码中,经常可以看见形如<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">#define do{ }while(0)</SPAN>的宏定义,是否感到疑惑呢?宏定义只是帮助我们进行替换而已,当定义多条语句时,会在if...else...语句中产生歧义,详细解释参考<A href="http://zhidao.baidu.com/question/57329016.html" target=_blank><FONT color=#000000>链接</FONT></A>。(小插曲,我在测试中只<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">#include &lt;stdlib.h&gt;</SPAN>,忘记了<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">#include &lt;stdio.h&gt;</SPAN>,然后在后面使用了<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">printf</SPAN>等,结果编译的时候产生警告:<BR></DIV>
<DIV style="MARGIN: 15px" width="100%">
<TABLE style="BORDER-BOTTOM: rgb(153,153,153) 1px solid; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; FONT-SIZE: 12px; BORDER-TOP: rgb(153,153,153) 1px solid; BORDER-RIGHT: rgb(153,153,153) 1px solid" align=center>
<TBODY>
<TR>
<TD style="BACKGROUND-COLOR: rgb(199,199,199)"><SPAN style="FONT-WEIGHT: bold">warning: <SPAN style="COLOR: rgb(118,118,118)">implicit declaration of function ‘printf’</SPAN></SPAN><BR style="FONT-WEIGHT: bold"><SPAN style="FONT-WEIGHT: bold">warning: <SPAN style="COLOR: rgb(118,118,118)">incompatible implicit declaration of built-in function ‘printf’</SPAN></SPAN></TD></TR></TBODY></TABLE></DIV>
<DIV style="MARGIN: 15px" width="100%">经过查找才知道警告的原因是没有包含<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">printf</SPAN>函数的明确定义,那么就隐式定义了。而编译时库里恰好有这个函数,虽然不会出错,但会给出警告。从代码习惯上讲,所有函数都应该被明确定义,切记)<BR><BR>一般的DNS是基于UDP,报文格式如下图:<BR><BR></DIV>
<DIV style="MARGIN: 15px" align=center width="100%"><IMG src="http://blogimg.chinaunix.net/blog/upfile2/080923204717.jpg" width=500 __1313585478953__="ev_9137600137">500)this.width=500;" border=0&gt;<BR>
<DIV style="TEXT-ALIGN: left">前面是固定的<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">12</SPAN>byte首部,后面是<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">4</SPAN>个长度可变的字段。<BR><BR>从首部开始,<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">0~15</SPAN>位bit刚好是<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">2</SPAN>个byte,由客户程序设置并由服务器返回,客户程序通过它来确定响应是否与查询匹配(例如,客户程序在这里输入的是十六进制的0xD8B4,那么服务器的该字段也会填入相同的值。这个标识又称为<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">Transaction ID</SPAN>,在<A href="http://241072.blog.51cto.com/231072/54307" target=_blank><FONT color=#000000>《DNS欺骗技术原理与安全防范技术》</FONT></A>中有更详细的讨论)。<BR></DIV></DIV>
<DIV style="MARGIN: 15px" width="100%"><BR>接下来的<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">16~31</SPAN>位bit刚好也是<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">2</SPAN>个byte,用作协议的标志位<BR></DIV>
<DIV style="MARGIN: 15px" align=center width="100%"><IMG src="http://blogimg.chinaunix.net/blog/upfile2/080924151245.jpg" __1313585478953__="ev_7688679543">500)this.width=500;" border=0&gt;<BR>
<DIV style="TEXT-ALIGN: left">
<UL>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">QR</SPAN>是1个bit位:0代表查询报文,1代表相应报文 </LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">opcode</SPAN>是4个bit位字段:0代表标准查询,1代表反向查询,2代表服务器状态请求 </LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">AA</SPAN>是1个bit位,是<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">Authoritative Answer</SPAN>的缩写,指明名字服务器是授权于该域的 </LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">TC</SPAN>是1个bit位,是<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">Truncated</SPAN>的缩写,意为可截断的,指明在UDP中应答报文超过512字节时,只返回512字节 </LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">RD</SPAN>是1个bit位,是<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">Recursion Desired</SPAN>的缩写,意为期望递归,期望名字服务器必须处理这个查询,而不是给出一个迭代查询服务器的列表 </LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">RA</SPAN>是1个bit位,是<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">Recursion Available</SPAN>的缩写,意为可用递归,如果名字服务器支持递归查询,这会将此位设置为1 </LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">zero</SPAN>是3个bit位,设置为0 </LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">rcode</SPAN>是4个bit位,表示名字差错,0为无差错,3为有差错。当查询中指定的域不存在的时候,就返回3</LI></UL>现在通过抓包来加深对上面的理解:<BR><IMG src="http://blogimg.chinaunix.net/blog/upfile2/080924172043.gif" __1313585478953__="ev_9701976653"><BR></DIV></DIV>
<DIV style="MARGIN: 15px" width="100%">通过上图我们可以,二进制格式就为<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">0000 0001 0000 0000</SPAN>,16位bit两个byte,其十六进制值为<SPAN style="COLOR: rgb(153,1,153); FONT-WEIGHT: bold">0x0100</SPAN>,这是一个标准的DNS查询请求的标志位<BR><BR>再接着是4段16位bit:<BR></DIV>
<DIV style="MARGIN: 15px" width="100%">
<UL>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">QuestionCount</SPAN> 查询问题记录数由客户端填写,服务器端按原值返回 </LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">AnswerCount</SPAN> 资源记录数由服务器端填写,代表有多少适应这个问题记录的对应IP<BR></LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">NameServerCount</SPAN> 授权资源记录数,一般为0<BR></LI>
<LI><SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">AdditionalCount</SPAN> 额外资源记录数,一般为0</LI></UL></DIV>现在通过抓包来加深对上面的理解:<BR>
<DIV style="TEXT-ALIGN: left"><IMG src="http://blogimg.chinaunix.net/blog/upfile2/080924171026.gif" __1313585478953__="ev_6613115906">500)this.width=500;" border=0&gt;</DIV><BR>分析完报文头,现在该是报文体了。分为四大块:<BR>
<UL>
<LI style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">查询问题 </LI>
<LI style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">回答 </LI>
<LI style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">授权 </LI>
<LI style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">额外信息</LI></UL>先看<SPAN style="FONT-WEIGHT: bold">查询问题</SPAN>,它通常只有一个问题,当然也可以有多个问题,问题数由QuestionCount确定:<BR>
<DIV style="TEXT-ALIGN: center"><IMG src="http://blogimg.chinaunix.net/blog/upfile2/080924174238.gif" __1313585478953__="ev_9614616063"><BR></DIV>查询名是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值,来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。计数字节的值必须是0~63的数,因为标识符的最大长度仅为63。该字段无需以整32bit边界结束,即无需填充字节。这种编码格式非常象BT协议中bencode编码,例如查询<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">twistedmatrix.com</SPAN>:<BR>
<DIV style="TEXT-ALIGN: center"><IMG src="http://blogimg.chinaunix.net/blog/upfile2/080925172639.gif" __1313585478953__="ev_4322353105">500)this.width=500;" border=0&gt;<BR></DIV>第一位为计数位,从首字母到第一个<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">.</SPAN>号,一共是13位(<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">twistedmatrix</SPAN>),然后是第二个计数位,值为3,由<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">com</SPAN>计算得到,最后是结束符号0。<BR>接着就是<SPAN style="FONT-WEIGHT: bold">查询类型</SPAN>,该类型就是针对查询问题的,在RFC中有详细的描述,一般使用如下表:
<TABLE style="BORDER-BOTTOM: medium none; TEXT-ALIGN: left; BORDER-LEFT: medium none; BORDER-COLLAPSE: collapse; MARGIN-LEFT: auto; BORDER-TOP: medium none; MARGIN-RIGHT: auto; BORDER-RIGHT: medium none" border=1 cellSpacing=0 cellPadding=0>
<TBODY>
<TR>
<TD style="BORDER-BOTTOM: black 1pt solid; BORDER-LEFT: black 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BACKGROUND: rgb(217,217,217); BORDER-TOP: black 1pt solid; BORDER-RIGHT: black 1pt solid; PADDING-TOP: 0cm; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" vAlign=top width=54>
<P><B><SPAN style="FONT-SIZE: 9pt">类型</SPAN></B><B><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></B></P></TD>
<TD style="BORDER-BOTTOM: black 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BACKGROUND: rgb(217,217,217); BORDER-TOP: black 1pt solid; BORDER-RIGHT: black 1pt solid; PADDING-TOP: 0cm; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" vAlign=top width=57>
<P><B><SPAN style="FONT-SIZE: 9pt">值</SPAN></B><B><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></B></P></TD>
<TD style="BORDER-BOTTOM: black 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BACKGROUND: rgb(217,217,217); BORDER-TOP: black 1pt solid; BORDER-RIGHT: black 1pt solid; PADDING-TOP: 0cm; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" vAlign=top width=198>
<P><B><SPAN style="FONT-SIZE: 9pt">描述</SPAN></B><B><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></B></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>A</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>1</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>IP</SPAN><SPAN style="FONT-SIZE: 9pt">地址</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>NS</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>2</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">名字服务器</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>MD</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>3</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">邮件目的的</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>(</SPAN><SPAN style="FONT-SIZE: 9pt">已过时,请用</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>MX)</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>MF</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>4</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">邮件中转站</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>(</SPAN><SPAN style="FONT-SIZE: 9pt">已过时,请用</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>MX)</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>CNAME</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>5</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">规范名词</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>SOA</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>6</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>&nbsp;xxx</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>MB</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>7</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">邮箱记录名</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>(</SPAN><SPAN style="FONT-SIZE: 9pt">实验性质</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>)</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>MG</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>8</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">邮件组成员</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>(</SPAN><SPAN style="FONT-SIZE: 9pt">实验性质</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>)</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>MR</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>9</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">邮件更改后记录名</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>(</SPAN><SPAN style="FONT-SIZE: 9pt">实验性质</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>)</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>NULL</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>10</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">空</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>RR(</SPAN><SPAN style="FONT-SIZE: 9pt">实验性质</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US>)</SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>WKS</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>11</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">众所皆知的服务描述</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>PTR</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>12</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">指针记录</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>HINFO</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>13</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">主机信息</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>MINFO</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>14</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">邮箱或者邮件列表信息</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>MX</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>15</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">邮件交换记录</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></P></TD></TR>
<TR>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 40.85pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=54>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>TXT</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 42.55pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=57>
<P><SPAN style="FONT-SIZE: 9pt" lang=EN-US>16</SPAN></P></TD>
<TD style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 148.8pt; PADDING-RIGHT: 5.4pt; FONT-FAMILY: 黑体; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" vAlign=top width=198>
<P><SPAN style="FONT-SIZE: 9pt">文本字符串</SPAN><SPAN style="FONT-SIZE: 9pt" lang=EN-US></SPAN></P></TD></TR></TBODY></TABLE><SPAN style="FONT-SIZE: 9pt" lang=EN-US>最常用的查询类型为A,表示期望获得查询名对应的IP地址。最后的<SPAN style="FONT-WEIGHT: bold">查询类</SPAN>,通常是1,指互联网地址<BR><BR>剩下的3个字段是:<SPAN style="FONT-WEIGHT: bold">回答</SPAN>,<SPAN style="FONT-WEIGHT: bold">授权</SPAN>和<SPAN style="FONT-WEIGHT: bold">额外信息</SPAN>,均采用<SPAN style="FONT-WEIGHT: bold">资源记录RR</SPAN>(<SPAN style="COLOR: rgb(0,128,255); FONT-WEIGHT: bold">Resource Record</SPAN>)格式,如下图:<BR></SPAN>
<DIV align=center>500)this.width=500;" border=0&gt;<IMG src="http://blogimg.chinaunix.net/blog/upfile2/080925194234.gif" width=500 __1313585478953__="ev_5370869917"></DIV><SPAN style="FONT-SIZE: 9pt" lang=EN-US>域名是记录中资源数据对应的名字。它的格式和前面介绍的查询名字段格式相同。类型说明RR的类型码。它的值和前面介绍的查询类型值是一样的。类通常为1,指Internet数据。生存时间字段是客户程序保留该资源记录的秒数。资源记录通常的生存时间值为2天。资源数据长度说明资源数据的数量。该数据的格式依赖于类型字段的值。对于类型1(A记录)资源数据是4字节的IP地址。<BR></SPAN><BR>=============================================================================
<DIV style="MARGIN: 15px" width="100%">上文已提过,通常进行域名和IP地址的转换时,使用<SPAN style="FONT-WEIGHT: bold">gethostbyname()</SPAN>和<SPAN style="FONT-WEIGHT: bold">gethostbyaddr()</SPAN>(在W.Richard Stevens的《Unix Network Programming》第11章有详细的说明)。当仔细分析了DNS的协议后,我们自己动手来写写看。<BR>下例执行的环境在<SPAN style="FONT-WEIGHT: bold">Debian4.0</SPAN>上,编译工具为<SPAN style="FONT-WEIGHT: bold">gcc</SPAN>,DNS服务器地址为<SPAN style="FONT-WEIGHT: bold">192.168.1.1</SPAN>(通常该服务的默认监听端口为<SPAN style="FONT-WEIGHT: bold">53</SPAN>),文件名为<SPAN style="FONT-WEIGHT: bold">DNSClient.c</SPAN>:<BR>
<TABLE style="BORDER-BOTTOM: rgb(153,153,153) 1px solid; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; FONT-SIZE: 12px; BORDER-TOP: rgb(153,153,153) 1px solid; BORDER-RIGHT: rgb(153,153,153) 1px solid" align=center>
<TBODY>
<TR>
<TD style="BACKGROUND-COLOR: rgb(199,199,199)">
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#include</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: maroon">&lt;stdio.h&gt;</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#include</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: maroon">&lt;stdlib.h&gt;</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#include</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: maroon">&lt;error.h&gt;</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#include</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: maroon">&lt;string.h&gt;</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#include</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: maroon">&lt;sys/socket.h&gt;</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#include</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: maroon">&lt;sys/types.h&gt;</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#include</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: maroon">&lt;netinet/in.h&gt;</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#include</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: maroon">&lt;arpa/inet.h&gt;</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#include</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: maroon">&lt;time.h&gt;</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: maroon; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>static</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: blue">void</SPAN> printmessage(<SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *buf);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>static</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *printnamestring(<SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *p,<SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *buf);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#define</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> GETWORD(__w,__p) <SPAN style="COLOR: blue">do</SPAN>{__w=*(__p++)&lt;&lt;8;__w|=*(p++);}<SPAN style="COLOR: blue">while</SPAN>(0)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>#define</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> GETLONG(__l,__p) <SPAN style="COLOR: blue">do</SPAN>{__l=*(__p++)&lt;&lt;24;__l|=*(__p++)&lt;&lt;16;__l|=*(__p++)&lt;&lt;8;__l|=*(p++);}<SPAN style="COLOR: blue">while</SPAN>(0)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>int</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> main(<SPAN style="COLOR: blue">int</SPAN> argc,<SPAN style="COLOR: blue">char</SPAN>* argv[])</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN>(argc != 2)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"usage: dnsclient &lt;host_name&gt;\n"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">return</SPAN> -1;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>time_t ident;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">int</SPAN> fd;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">int</SPAN> rc;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">int</SPAN> serveraddrlent;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">char</SPAN> *q;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *p;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *countp;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> reqBuf = {0};</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> rplBuf = {0};</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">struct</SPAN> sockaddr_in serveraddr;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//udp</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>fd = socket(AF_INET, SOCK_DGRAM, 0);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN>(fd == -1)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>perror(<SPAN style="COLOR: maroon">"error create udp socket"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">return</SPAN> -1;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>time(&amp;ident);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//copy</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>p = reqBuf;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//Transaction ID</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = ident;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = ident&gt;&gt;8;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//Header section</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//flag word = 0x0100</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x01;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x00;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//Questions = 0x0001</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//just one query</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x00;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x01;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//Answer RRs = 0x0000</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//no answers in this message</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x00;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x00;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//Authority RRs = 0x0000</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x00;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x00;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//Additional RRs = 0x0000</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x00;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0x00;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//Query section</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>countp = p;<SPAN>&nbsp;&nbsp; </SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">for</SPAN>(q=argv; *q!=0; q++)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN>(*q != <SPAN style="COLOR: maroon">'.'</SPAN>)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>(*countp)++;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = *q;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">else</SPAN> <SPAN style="COLOR: blue">if</SPAN>(*countp != 0)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>countp = p;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN>(*countp != 0)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>*(p++) = 0;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//Type=1(A):host address</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++)=0;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++)=1;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//Class=1(IN):internet</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++)=0;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>*(p++)=1;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"\nRequest:\n"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printmessage(reqBuf);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//fill<SPAN> </SPAN></SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>bzero(&amp;serveraddr, <SPAN style="COLOR: blue">sizeof</SPAN>(serveraddr));</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>serveraddr.sin_family = AF_INET;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>serveraddr.sin_port = htons(53);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>serveraddr.sin_addr.s_addr = inet_addr(<SPAN style="COLOR: maroon">"192.168.1.1"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//send to DNS Serv</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN>(sendto(fd,reqBuf,p-reqBuf,0,(<SPAN style="COLOR: blue">void</SPAN> *)&amp;serveraddr,<SPAN style="COLOR: blue">sizeof</SPAN>(serveraddr)) &lt; 0)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>perror(<SPAN style="COLOR: maroon">"error sending request"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">return</SPAN> -1;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//recev the reply</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>bzero(&amp;serveraddr,<SPAN style="COLOR: blue">sizeof</SPAN>(serveraddr));</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>serveraddrlent = <SPAN style="COLOR: blue">sizeof</SPAN>(serveraddr);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>rc = recvfrom(fd,&amp;rplBuf,<SPAN style="COLOR: blue">sizeof</SPAN>(rplBuf),0,(<SPAN style="COLOR: blue">void</SPAN> *)&amp;serveraddr,&amp;serveraddrlent);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN>(rc &lt; 0)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>perror(<SPAN style="COLOR: maroon">"error receiving request\n"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">return</SPAN> -1;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>}<SPAN>&nbsp;&nbsp; </SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//print out results</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"\nReply:\n"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printmessage(rplBuf);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//exit</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"Program Exit\n"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">return</SPAN> 0;<SPAN>&nbsp; </SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>static</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: blue">void</SPAN> printmessage(<SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *buf)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *p;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">int</SPAN> ident,flags,qdcount,ancount,nscount,arcount;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">int</SPAN> i,j,type,<SPAN style="COLOR: blue">class</SPAN>,ttl,rdlength;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>p = buf;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(ident,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"ident=%#x\n"</SPAN>,ident);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(flags,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"flags=%#x\n"</SPAN>,flags);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//printf("qr=%u\n",(flags&gt;&gt;15)&amp;1);</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"qr=%u\n"</SPAN>,flags&gt;&gt;15);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"opcode=%u\n"</SPAN>,(flags&gt;&gt;11)&amp;15);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"aa=%u\n"</SPAN>,(flags&gt;&gt;10)&amp;1);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"tc=%u\n"</SPAN>,(flags&gt;&gt;9)&amp;1);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"rd=%u\n"</SPAN>,(flags&gt;&gt;8)&amp;1);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"ra=%u\n"</SPAN>,(flags&gt;&gt;7)&amp;1);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"z=%u\n"</SPAN>,(flags&gt;&gt;4)&amp;7);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"rcode=%u\n"</SPAN>,flags&amp;15);<SPAN>&nbsp; </SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(qdcount,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"qdcount=%u\n"</SPAN>,qdcount);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(ancount,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"ancount=%u\n"</SPAN>,ancount);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(nscount,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"nscount=%u\n"</SPAN>,nscount);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(arcount,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"arcount=%u\n"</SPAN>,arcount);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">for</SPAN>(i=0; i&lt;qdcount; i++)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"qd[%u]:\n"</SPAN>,i);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">while</SPAN>(*p!=0)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>p = printnamestring(p,buf);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN>(*p != 0)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"."</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>p++;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"\n"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(type,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"type=%u\n"</SPAN>,type);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(<SPAN style="COLOR: blue">class</SPAN>,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"class=%u\n"</SPAN>,<SPAN style="COLOR: blue">class</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">for</SPAN>(i=0; i&lt;ancount; i++)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"an[%u]:\n"</SPAN>,i);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>p = printnamestring(p,buf);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"\n"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(type,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"type=%u\n"</SPAN>,type);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(<SPAN style="COLOR: blue">class</SPAN>,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"class=%u\n"</SPAN>,<SPAN style="COLOR: blue">class</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>GETLONG(ttl,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"ttl=%u\n"</SPAN>,ttl);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>GETWORD(rdlength,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"rdlength=%u\n"</SPAN>,rdlength);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"rd="</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">for</SPAN>(j=0; j&lt;rdlength; j++)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"%2.2x(%u)"</SPAN>,*p,*p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>p++;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"\n"</SPAN>);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt" lang=EN-US>static</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US> <SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *printnamestring(<SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *p,<SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">char</SPAN> *buf)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">unsigned</SPAN> <SPAN style="COLOR: blue">int</SPAN> nchars,offset;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>nchars = *(p++);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN>((nchars &amp; 0xc0) == 0xc0)</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>offset = (nchars &amp; 0x3f) &lt;&lt; 8;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>offset |= *(p++);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>nchars = buf;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"%*.*s"</SPAN>,nchars,nchars,buf+offset);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">else</SPAN></SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>{</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>printf(<SPAN style="COLOR: maroon">"%*.*s"</SPAN>,nchars,nchars,p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>p += nchars;</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>}</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">return</SPAN> (p);</SPAN></P>
<P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt" lang=EN-US>}</SPAN></P>
<P><SPAN lang=EN-US></SPAN>&nbsp;</P></TD></TR></TBODY></TABLE>编译命令为<BR><SPAN style="FONT-WEIGHT: bold">lsj@debian007:~$ <SPAN style="COLOR: rgb(0,128,255)">gcc -g -Wall -o DNSClient DNSClient.c</SPAN></SPAN><BR>然后执行:<BR><SPAN style="FONT-WEIGHT: bold">lsj@debian007:~$ <SPAN style="COLOR: rgb(0,128,255)">./DNSClient bigdogchina.cublog.cn</SPAN></SPAN><BR>就可以看见结果啦,这里使用的是UDP的数据格式,我们知道UDP的头部有一个<SPAN style="FONT-WEIGHT: bold">16bit</SPAN>的长度,那么能表示的最大长度为2的16次方<SPAN style="FONT-WEIGHT: bold">65536</SPAN>,再减去包头20,所以UDP包最大长度为65536-20=<SPAN style="FONT-WEIGHT: bold">65516</SPAN>,但是在实际应用中,最好不要超过<SPAN style="FONT-WEIGHT: bold">1K</SPAN></DIV></DIV>
页: [1]
查看完整版本: C实现DNS ---转载