<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>1129 &#187; 程序人生</title>
	<atom:link href="http://www.vi1129.com/category/code/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vi1129.com</link>
	<description>学无止境 我心飞翔</description>
	<lastBuildDate>Mon, 05 Jul 2010 15:30:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>UNIX常用的IP表示掩码方式转换为字符串的程序实现方法</title>
		<link>http://www.vi1129.com/2010/05/unix%e5%b8%b8%e7%94%a8%e7%9a%84ip%e8%a1%a8%e7%a4%ba%e6%8e%a9%e7%a0%81%e6%96%b9%e5%bc%8f%e8%bd%ac%e6%8d%a2%e4%b8%ba%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e7%a8%8b%e5%ba%8f%e5%ae%9e%e7%8e%b0%e6%96%b9/</link>
		<comments>http://www.vi1129.com/2010/05/unix%e5%b8%b8%e7%94%a8%e7%9a%84ip%e8%a1%a8%e7%a4%ba%e6%8e%a9%e7%a0%81%e6%96%b9%e5%bc%8f%e8%bd%ac%e6%8d%a2%e4%b8%ba%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e7%a8%8b%e5%ba%8f%e5%ae%9e%e7%8e%b0%e6%96%b9/#comments</comments>
		<pubDate>Fri, 21 May 2010 11:22:02 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/2010/05/unix%e5%b8%b8%e7%94%a8%e7%9a%84ip%e8%a1%a8%e7%a4%ba%e6%8e%a9%e7%a0%81%e6%96%b9%e5%bc%8f%e8%bd%ac%e6%8d%a2%e4%b8%ba%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e7%a8%8b%e5%ba%8f%e5%ae%9e%e7%8e%b0%e6%96%b9/</guid>
		<description><![CDATA[<p>一种IP的表示方式为192.168.1.1/24，其数字24的含义为24位掩码，即掩码为255.255.255.0，程序中读入的类似192.168.1.1/24的字符串可能需要转换为IP地址和掩码两个字符串保存或处理，即将192.168.1.1/24转换为192.168.1.1和255.255.255.0，一种程序的实现方法如下</p>

?View Code C#include &#60;stdio.h&#62;
#include &#60;sys/socket.h&#62;
#include &#60;netinet/in.h&#62;
#include &#60;arpa/inet.h&#62;
#include &#60;string.h&#62;
int main&#40;&#41;
&#123;
	char ip&#91;&#93; = &#34;192.168.1.1/24&#34;;
	uint8_t *ipPrint = NULL;
	uint32_t ipAddr;
	uint32_t *ipPtr = &#38;ipAddr;
	uint32_t mask = 0;
	uint32_t value = 0;
	uint32_t i = 0, j = 0;
	uint8_t *ptr = NULL;
	struct in_addr in;
	ptr = strtok&#40;ip, &#34;/&#34;&#41;;
	inet_aton&#40;ptr, &#40;struct in_addr *&#41;ipPtr&#41;;
&#160;
	ptr = strtok&#40;NULL, &#34;/&#34;&#41;;
	value = atoi&#40;ptr&#41;;
&#160;
	for&#40;i = 0; i&#60;value; i++&#41;
	&#123;
		j = value-i-1;
		mask &#124;= 1&#60;&#60;j;
	&#125;
	printf&#40;&#34;%.8x\n%.8x\n&#34;,ipAddr,mask&#41;;
	in.s_addr <p><a href="http://www.vi1129.com/2010/05/unix%e5%b8%b8%e7%94%a8%e7%9a%84ip%e8%a1%a8%e7%a4%ba%e6%8e%a9%e7%a0%81%e6%96%b9%e5%bc%8f%e8%bd%ac%e6%8d%a2%e4%b8%ba%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e7%a8%8b%e5%ba%8f%e5%ae%9e%e7%8e%b0%e6%96%b9/">继续阅读</a></p>


No related posts.]]></description>
			<content:encoded><![CDATA[<p>一种IP的表示方式为192.168.1.1/24，其数字24的含义为24位掩码，即掩码为255.255.255.0，程序中读入的类似192.168.1.1/24的字符串可能需要转换为IP地址和掩码两个字符串保存或处理，即将192.168.1.1/24转换为192.168.1.1和255.255.255.0，一种程序的实现方法如下</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p697code2'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6972"><td class="code" id="p697code2"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/socket.h&gt;</span>
<span style="color: #339933;">#include &lt;netinet/in.h&gt;</span>
<span style="color: #339933;">#include &lt;arpa/inet.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span> ip<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;192.168.1.1/24&quot;</span><span style="color: #339933;">;</span>
	uint8_t <span style="color: #339933;">*</span>ipPrint <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
	uint32_t ipAddr<span style="color: #339933;">;</span>
	uint32_t <span style="color: #339933;">*</span>ipPtr <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>ipAddr<span style="color: #339933;">;</span>
	uint32_t mask <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	uint32_t value <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	uint32_t i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	uint8_t <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> in_addr in<span style="color: #339933;">;</span>
	ptr <span style="color: #339933;">=</span> strtok<span style="color: #009900;">&#40;</span>ip<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	inet_aton<span style="color: #009900;">&#40;</span>ptr<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> in_addr <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>ipPtr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	ptr <span style="color: #339933;">=</span> strtok<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	value <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>ptr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>value<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		j <span style="color: #339933;">=</span> value<span style="color: #339933;">-</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		mask <span style="color: #339933;">|=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">&lt;&lt;</span>j<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%.8x<span style="color: #000099; font-weight: bold;">\n</span>%.8x<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>ipAddr<span style="color: #339933;">,</span>mask<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	in.<span style="color: #202020;">s_addr</span> <span style="color: #339933;">=</span> ipAddr<span style="color: #339933;">;</span>
	ipPrint <span style="color: #339933;">=</span> inet_ntoa<span style="color: #009900;">&#40;</span>in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>ipPrint<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	in.<span style="color: #202020;">s_addr</span> <span style="color: #339933;">=</span> mask<span style="color: #339933;">;</span>
	ipPrint <span style="color: #339933;">=</span> inet_ntoa<span style="color: #009900;">&#40;</span>in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>ipPrint<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2010/05/unix%e5%b8%b8%e7%94%a8%e7%9a%84ip%e8%a1%a8%e7%a4%ba%e6%8e%a9%e7%a0%81%e6%96%b9%e5%bc%8f%e8%bd%ac%e6%8d%a2%e4%b8%ba%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e7%a8%8b%e5%ba%8f%e5%ae%9e%e7%8e%b0%e6%96%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C hash table code</title>
		<link>http://www.vi1129.com/2010/04/c-hash-table-code/</link>
		<comments>http://www.vi1129.com/2010/04/c-hash-table-code/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 08:25:43 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[hash]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=680</guid>
		<description><![CDATA[<p>This code modified from internet,insert IP and MAC to hashtable. Key is the last 16bit of MAC.</p>
<p>too busy without search and delete function, you can add them if your interested.</p>

?Download zhash.h1
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
#ifndef _ZHASH_H_
#define _ZHASH_H_
#include &#60;stdio.h&#62;
#include &#60;string.h&#62;
#include &#60;stdlib.h&#62;
&#160;
#define MAXHASHSIZE	16	
#define ETH_ALEN	6
typedef struct _hashentry
&#123;
    void *key;
    void *ipaddr;
    void *mac;
 <p><a href="http://www.vi1129.com/2010/04/c-hash-table-code/">继续阅读</a></p>


关联文章:<ol><li><a href='http://www.vi1129.com/2009/06/make-timer-with-signal/' rel='bookmark' title='Permanent Link: 使用setitimer和signal创建一个计时器'>使用setitimer和signal创建一个计时器</a></li>
<li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2010/02/node/' rel='bookmark' title='Permanent Link: 自写一则单链表小程序'>自写一则单链表小程序</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>This code modified from internet,insert IP and MAC to hashtable. Key is the last 16bit of MAC.</p>
<p>too busy without search and delete function, you can add them if your interested.</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://www.vi1129.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=680&amp;download=zhash.h">zhash.h</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6807"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p680code7"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef _ZHASH_H_</span>
<span style="color: #339933;">#define _ZHASH_H_</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define MAXHASHSIZE	16	</span>
<span style="color: #339933;">#define ETH_ALEN	6</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> _hashentry
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>key<span style="color: #339933;">;</span>
    <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ipaddr<span style="color: #339933;">;</span>
    <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>mac<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> _hashentry <span style="color: #339933;">*</span>next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>hashentry<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> _hashtable
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>gethash<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>compare<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*,</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> hashsize<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> count<span style="color: #339933;">;</span>
    hashentry <span style="color: #339933;">**</span>hashlist<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>hashtable<span style="color: #339933;">;</span>
<span style="color: #993333;">typedef</span> <span style="color: #000000; font-weight: bold;">enum</span> bool_t <span style="color: #009900;">&#123;</span>
    FALSE <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>
    TRUE
<span style="color: #009900;">&#125;</span>bool<span style="color: #339933;">;</span>
hashtable <span style="color: #339933;">*</span>hash_create_t<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>keyfunc<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		       <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>comparefunc<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*,</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	  	       <span style="color: #993333;">int</span> size<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> hash_insert<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>key<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ipaddr<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>mac<span style="color: #339933;">,</span> hashtable <span style="color: #339933;">*</span>tab<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> lh_strhash<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>src<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> equal_str<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>k1<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>k2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> hash_print<span style="color: #009900;">&#40;</span>hashtable <span style="color: #339933;">*</span>tab<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//void help();</span>
<span style="color: #339933;">#define hash_create(size)	hash_create_t(lh_strhash,equal_str,size) </span>
<span style="color: #339933;">#define hashindex(key, tab)	((tab-&gt;gethash)(key)) % (tab-&gt;hashsize)</span>
<span style="color: #339933;">#endif</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://www.vi1129.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=680&amp;download=zhash.c">zhash.c</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6808"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p680code8"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;zhash.h&quot;</span>
&nbsp;
<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> lh_strhash<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span> src<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> l<span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> ret <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">short</span> <span style="color: #339933;">*</span>s<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>src<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>str <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
	<span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    l <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
    s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">short</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>str<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> l<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	ret <span style="color: #339933;">^=</span> s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&amp;</span><span style="color: #208080;">0x0f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span>ret<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> equal_str<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>k1<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>k2<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span> <span style="color: #339933;">==</span> strcmp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>k1<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>k2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
hashentry <span style="color: #339933;">*</span>hlist_new<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>key<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ipaddr<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>mac<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    hashentry <span style="color: #339933;">*</span>new <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>hashentry <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>hashentry<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    new<span style="color: #339933;">-&gt;</span>key <span style="color: #339933;">=</span> key<span style="color: #339933;">;</span> 
    new<span style="color: #339933;">-&gt;</span>ipaddr <span style="color: #339933;">=</span> ipaddr<span style="color: #339933;">;</span>
    new<span style="color: #339933;">-&gt;</span>mac <span style="color: #339933;">=</span> mac<span style="color: #339933;">;</span>
    new<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> new<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> hlist_append<span style="color: #009900;">&#40;</span>hashentry <span style="color: #339933;">**</span>root<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>key<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ipaddr<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>mac<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    hashentry <span style="color: #339933;">*</span>new<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>pos<span style="color: #339933;">;</span>
    new <span style="color: #339933;">=</span> hlist_new<span style="color: #009900;">&#40;</span>key<span style="color: #339933;">,</span> ipaddr<span style="color: #339933;">,</span> mac<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>root <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	<span style="color: #339933;">*</span>root <span style="color: #339933;">=</span> new<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
	pos <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>root<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>pos<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span>
	    pos <span style="color: #339933;">=</span> pos<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
	pos<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> new<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
bool hlist_update<span style="color: #009900;">&#40;</span>hashentry <span style="color: #339933;">*</span>root<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>key<span style="color: #339933;">,</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ipaddr<span style="color: #339933;">,</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>mac<span style="color: #339933;">,</span><span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>compare<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*,</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    hashentry <span style="color: #339933;">*</span>pos<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">=</span> root<span style="color: #339933;">;</span> pos <span style="color: #339933;">!=</span> NULL<span style="color: #339933;">;</span> pos <span style="color: #339933;">=</span> pos<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>compare<span style="color: #009900;">&#40;</span>key<span style="color: #339933;">,</span>pos<span style="color: #339933;">-&gt;</span>key<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//	    free(pos-&gt;ipaddr);</span>
<span style="color: #666666; font-style: italic;">//	    free(pos-&gt;mac);</span>
	    pos<span style="color: #339933;">-&gt;</span>ipaddr <span style="color: #339933;">=</span> ipaddr<span style="color: #339933;">;</span>
	    pos<span style="color: #339933;">-&gt;</span>mac <span style="color: #339933;">=</span> mac<span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//	    free(key);</span>
	    <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> FALSE<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> hash_insert<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>key<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ipaddr<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>mac<span style="color: #339933;">,</span> hashtable <span style="color: #339933;">*</span>tab<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> index <span style="color: #339933;">=</span> hashindex<span style="color: #009900;">&#40;</span>key<span style="color: #339933;">,</span> tab<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    hashentry <span style="color: #339933;">*</span>root <span style="color: #339933;">=</span> tab<span style="color: #339933;">-&gt;</span>hashlist<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>hlist_update<span style="color: #009900;">&#40;</span>root<span style="color: #339933;">,</span> key<span style="color: #339933;">,</span> ipaddr<span style="color: #339933;">,</span> mac<span style="color: #339933;">,</span> tab<span style="color: #339933;">-&gt;</span>compare<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	hlist_append<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>tab<span style="color: #339933;">-&gt;</span>hashlist<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>key<span style="color: #339933;">,</span>ipaddr<span style="color: #339933;">,</span> mac<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	tab<span style="color: #339933;">-&gt;</span>count<span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
hashtable <span style="color: #339933;">*</span>hash_create_t<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>keyfunc<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			<span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>comparefunc<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*,</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			<span style="color: #993333;">int</span> size<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> len <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>hashentry <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> size<span style="color: #339933;">;</span>
    hashtable <span style="color: #339933;">*</span>tab <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>hashtable <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>hashtable<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    memset <span style="color: #009900;">&#40;</span>tab<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>hashtable <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    tab<span style="color: #339933;">-&gt;</span>hashlist <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>hashentry<span style="color: #339933;">**</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>tab<span style="color: #339933;">-&gt;</span>hashlist <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	free<span style="color: #009900;">&#40;</span>tab<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    memset<span style="color: #009900;">&#40;</span>tab<span style="color: #339933;">-&gt;</span>hashlist<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>size<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	tab<span style="color: #339933;">-&gt;</span>hashlist<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    tab<span style="color: #339933;">-&gt;</span>gethash <span style="color: #339933;">=</span> keyfunc<span style="color: #339933;">;</span>
    tab<span style="color: #339933;">-&gt;</span>compare <span style="color: #339933;">=</span> comparefunc<span style="color: #339933;">;</span>
    tab<span style="color: #339933;">-&gt;</span>hashsize <span style="color: #339933;">=</span> size<span style="color: #339933;">;</span>
    tab<span style="color: #339933;">-&gt;</span>count <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> tab<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> hash_print<span style="color: #009900;">&#40;</span>hashtable <span style="color: #339933;">*</span>tab<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    hashentry <span style="color: #339933;">*</span>temp<span style="color: #339933;">;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;index<span style="color: #000099; font-weight: bold;">\t</span>%-20s<span style="color: #000099; font-weight: bold;">\t</span>%-20s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;mac&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;ipaddr&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> MAXHASHSIZE<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	temp <span style="color: #339933;">=</span> tab<span style="color: #339933;">-&gt;</span>hashlist<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>temp <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
	    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%-d<span style="color: #000099; font-weight: bold;">\t</span>%-20s<span style="color: #000099; font-weight: bold;">\t</span>%-20s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>i<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;NULL&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;NULL&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span>
	    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>temp <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
	    p <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>temp<span style="color: #339933;">-&gt;</span>mac<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%.2x:%.2x:%.2x:%.2x:%.2x:%.2x<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    p <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>temp<span style="color: #339933;">-&gt;</span>ipaddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>format <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>temp<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d.%d.%d.%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d.%d.%d.%d --&gt;<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span>format<span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    temp <span style="color: #339933;">=</span> temp<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #808080; font-style: italic;">/*
void help()
{
    printf(&quot;command: \n&quot;);
    printf(&quot;  -insert\n&quot;);
    printf(&quot;\t--usage: insert mac ipaddr  eg. insert 00:11:22:33:44:55 192.168.0.1\n&quot;);
    printf(&quot;\t--description: insert mac,ip to hash table,mac divided by \&quot;:\&quot;,and ip by \&quot;.\&quot;\n&quot;);
    printf(&quot;  -del\n&quot;);
    printf(&quot;\t--usage:del key  eg.del 4455\n&quot;);
    printf(&quot;\t--description: delete from hash table,key is the last 16 bits of mac\n&quot;);
    printf(&quot;  -print\n&quot;);
    printf(&quot;\t--usage: print\n&quot;);
    printf(&quot;\t--description: print all over the hash table\n&quot;);
}*/</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://www.vi1129.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=680&amp;download=test.c">test.c</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6809"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p680code9"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;zhash.h&quot;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    hashtable <span style="color: #339933;">*</span>tab <span style="color: #339933;">=</span> hash_create<span style="color: #009900;">&#40;</span>MAXHASHSIZE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> mac<span style="color: #009900;">&#91;</span>ETH_ALEN<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x68</span><span style="color: #339933;">,</span><span style="color: #208080;">0x30</span><span style="color: #339933;">,</span><span style="color: #208080;">0x3b</span><span style="color: #339933;">,</span><span style="color: #208080;">0x2a</span><span style="color: #339933;">,</span><span style="color: #208080;">0x56</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> ipaddr<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #208080;">0xC0</span><span style="color: #339933;">,</span><span style="color: #208080;">0xA8</span><span style="color: #339933;">,</span><span style="color: #208080;">0x01</span><span style="color: #339933;">,</span><span style="color: #208080;">0x01</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> mac1<span style="color: #009900;">&#91;</span>ETH_ALEN<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x69</span><span style="color: #339933;">,</span><span style="color: #208080;">0x30</span><span style="color: #339933;">,</span><span style="color: #208080;">0x3b</span><span style="color: #339933;">,</span><span style="color: #208080;">0x2a</span><span style="color: #339933;">,</span><span style="color: #208080;">0x42</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> ipaddr1<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #208080;">0xC0</span><span style="color: #339933;">,</span><span style="color: #208080;">0xA8</span><span style="color: #339933;">,</span><span style="color: #208080;">0x01</span><span style="color: #339933;">,</span><span style="color: #208080;">0x02</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> key<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//    char key1[5];</span>
    memset<span style="color: #009900;">&#40;</span>key<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//    memset(key1,0,5);</span>
    sprintf<span style="color: #009900;">&#40;</span>key<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%.2x%.2x&quot;</span><span style="color: #339933;">,</span>mac<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>mac<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    hash_insert<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>key<span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>ipaddr<span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>mac<span style="color: #339933;">,</span>tab<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    sprintf<span style="color: #009900;">&#40;</span>key<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%.2x%.2x&quot;</span><span style="color: #339933;">,</span>mac1<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>mac1<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    hash_insert<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>key<span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>ipaddr1<span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>mac1<span style="color: #339933;">,</span>tab<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    hash_print<span style="color: #009900;">&#40;</span>tab<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://www.vi1129.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=680&amp;download=makefile">makefile</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p68010"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p680code10"><pre class="c" style="font-family:monospace;">CC <span style="color: #339933;">=</span> gcc
CFLAGS <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>Wall <span style="color: #339933;">-</span>g 
TARGET <span style="color: #339933;">=</span> zhash
SOURCE <span style="color: #339933;">=</span> \
zhash.<span style="color: #202020;">c</span> \
test.<span style="color: #202020;">c</span>
OBJS <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span>SOURCE<span style="color: #339933;">:%</span>.<span style="color: #202020;">c</span><span style="color: #339933;">=%</span>.<span style="color: #202020;">o</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #339933;">%</span>.<span style="color: #202020;">o</span><span style="color: #339933;">:%</span>.<span style="color: #202020;">c</span>
	$<span style="color: #009900;">&#40;</span>CC<span style="color: #009900;">&#41;</span> $<span style="color: #009900;">&#40;</span>CFLAGS<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span>c $<span style="color: #339933;">&lt;</span> <span style="color: #339933;">-</span>o $@
&nbsp;
$<span style="color: #009900;">&#40;</span>TARGET<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>$<span style="color: #009900;">&#40;</span>OBJS<span style="color: #009900;">&#41;</span>
	$<span style="color: #009900;">&#40;</span>CC<span style="color: #009900;">&#41;</span> $<span style="color: #009900;">&#40;</span>OBJS<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span>o $@ 
&nbsp;
clean<span style="color: #339933;">:</span>
	@echo <span style="color: #ff0000;">&quot;cleanning object...&quot;</span>
	<span style="color: #339933;">-</span>rm zhash <span style="color: #339933;">*</span>.<span style="color: #202020;">o</span>
	@echo <span style="color: #ff0000;">&quot;clean finished!&quot;</span>
.<span style="color: #202020;">PHONY</span><span style="color: #339933;">:</span>clean</pre></td></tr></table></div>



<p>关联文章:<ol><li><a href='http://www.vi1129.com/2009/06/make-timer-with-signal/' rel='bookmark' title='Permanent Link: 使用setitimer和signal创建一个计时器'>使用setitimer和signal创建一个计时器</a></li>
<li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2010/02/node/' rel='bookmark' title='Permanent Link: 自写一则单链表小程序'>自写一则单链表小程序</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2010/04/c-hash-table-code/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</title>
		<link>http://www.vi1129.com/2010/03/sock_raw-dump/</link>
		<comments>http://www.vi1129.com/2010/03/sock_raw-dump/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 04:44:32 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=663</guid>
		<description><![CDATA[<p>协议的分析需要参考前一篇文章以太网帧格式，IP包头，TCP头格式说明。</p>
<p>抓取网络上的数据包需要设置网卡为混杂模式，调用recvfrom在创建的SOCK_RAW类型的socket上接收来自kernel的信息，然后再按照帧格式，IP头，TCP头格式，指针移动到相应位置并分析。</p>
<p>附上的小程序由于其他原因还在UDP9001端口监听了来自客户端的消息，这与本文无关。</p>

?Download zhao_sock.h1
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
&#160;
#include &#60;stdio.h&#62;  //for printf
#include &#60;stdlib.h&#62; //for exit
#include &#60;string.h&#62; // for strcmp
#include &#60;sys/socket.h&#62; //for socket,address
#include &#60;sys/types.h&#62;
#include &#60;netinet/in.h&#62;
#include &#60;linux/if_ether.h&#62;
#include &#60;net/if.h&#62;
#include &#60;sys/ioctl.h&#62; //for ioctl
#include &#60;pthread.h&#62;
&#160;
#define INTERFACE &#34;eth0&#34;
#define BUFFLEN 2048
#define UDPPORT 9001
#define REQUEST 0
#define RESPONSE 1
#define RESERVE 2 
#define z_print(fmt,args...) \
 printf(&#34;[%s %d]&#34;fmt&#34;\n&#34;,__FILE__,__LINE__,##args)
typedef struct &#123;
 uint8_t version;
 uint8_t type;
 uint8_t len;
 uint16_t number;
 char data&#91;255&#93;;
&#125; datasend;
&#160;
void* ch_hanlder&#40;&#41;;
uint8_t <p><a href="http://www.vi1129.com/2010/03/sock_raw-dump/">继续阅读</a></p>


关联文章:<ol><li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
<li><a href='http://www.vi1129.com/2010/02/node/' rel='bookmark' title='Permanent Link: 自写一则单链表小程序'>自写一则单链表小程序</a></li>
<li><a href='http://www.vi1129.com/2009/06/make-timer-with-signal/' rel='bookmark' title='Permanent Link: 使用setitimer和signal创建一个计时器'>使用setitimer和signal创建一个计时器</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>协议的分析需要参考前一篇文章以太网帧格式，IP包头，TCP头格式说明。</p>
<p>抓取网络上的数据包需要设置网卡为混杂模式，调用recvfrom在创建的SOCK_RAW类型的socket上接收来自kernel的信息，然后再按照帧格式，IP头，TCP头格式，指针移动到相应位置并分析。</p>
<p>附上的小程序由于其他原因还在UDP9001端口监听了来自客户端的消息，这与本文无关。</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://www.vi1129.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=663&amp;download=zhao_sock.h">zhao_sock.h</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p66314"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p663code14"><pre class="c" style="font-family:monospace;">&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;  //for printf</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt; //for exit</span>
<span style="color: #339933;">#include &lt;string.h&gt; // for strcmp</span>
<span style="color: #339933;">#include &lt;sys/socket.h&gt; //for socket,address</span>
<span style="color: #339933;">#include &lt;sys/types.h&gt;</span>
<span style="color: #339933;">#include &lt;netinet/in.h&gt;</span>
<span style="color: #339933;">#include &lt;linux/if_ether.h&gt;</span>
<span style="color: #339933;">#include &lt;net/if.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/ioctl.h&gt; //for ioctl</span>
<span style="color: #339933;">#include &lt;pthread.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define INTERFACE &quot;eth0&quot;</span>
<span style="color: #339933;">#define BUFFLEN 2048</span>
<span style="color: #339933;">#define UDPPORT 9001</span>
<span style="color: #339933;">#define REQUEST 0</span>
<span style="color: #339933;">#define RESPONSE 1</span>
<span style="color: #339933;">#define RESERVE 2 </span>
<span style="color: #339933;">#define z_print(fmt,args...) \
 printf(&quot;[%s %d]&quot;fmt&quot;\n&quot;,__FILE__,__LINE__,##args)</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
 uint8_t version<span style="color: #339933;">;</span>
 uint8_t type<span style="color: #339933;">;</span>
 uint8_t len<span style="color: #339933;">;</span>
 uint16_t number<span style="color: #339933;">;</span>
 <span style="color: #993333;">char</span> data<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">255</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> datasend<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> ch_hanlder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
uint8_t randvalue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://www.vi1129.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=663&amp;download=zhao_sock.c">zhao_sock.c</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p66315"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p663code15"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;zhao_sock.h&quot;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> sockfd<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> len<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> proto<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> port_s<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> port_d<span style="color: #339933;">;</span>
	<span style="color: #993333;">char</span> recvbuff<span style="color: #009900;">&#91;</span>BUFFLEN<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> type<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>ethhead <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>iphead <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> ifreq ifr<span style="color: #339933;">;</span>
	pthread_t thread_ch<span style="color: #339933;">;</span>
&nbsp;
	pthread_create<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>thread_ch<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,&amp;</span>ch_hanlder<span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	sockfd <span style="color: #339933;">=</span> socket<span style="color: #009900;">&#40;</span>PF_PACKET<span style="color: #339933;">,</span>SOCK_RAW<span style="color: #339933;">,</span>htons<span style="color: #009900;">&#40;</span>ETH_P_ALL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>sockfd <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span> 
		z_print<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;socket create error&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	strcpy<span style="color: #009900;">&#40;</span>ifr.<span style="color: #202020;">ifr_name</span><span style="color: #339933;">,</span>INTERFACE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioctl<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span>SIOCGIFFLAGS<span style="color: #339933;">,&amp;</span>ifr<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		z_print<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;set PROMISC fail!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	ifr.<span style="color: #202020;">ifr_flags</span> <span style="color: #339933;">|=</span> IFF_PROMISC<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioctl<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span>SIOCGIFFLAGS<span style="color: #339933;">,&amp;</span>ifr<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		z_print<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;set PROMISC fail!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> 
	<span style="color: #009900;">&#123;</span>
		len <span style="color: #339933;">=</span> recvfrom<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span>recvbuff<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>recvbuff<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>len <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">42</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			z_print<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;receive error!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		ethhead <span style="color: #339933;">=</span> recvbuff<span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">//frame head point</span>
		p <span style="color: #339933;">=</span> ethhead<span style="color: #339933;">;</span>
		sprintf<span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%02x%02x&quot;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">//frame type</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;0800&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>  <span style="color: #666666; font-style: italic;">//0800 is IP frame</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;0806&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: ARP<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;8035&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: RARP<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">else</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: unknow<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;MAC:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x==&gt;%.2x:%.2x:%.2x:%.2x:%.2x:%.2x<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> \
				p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">//mac address</span>
			<span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		iphead <span style="color: #339933;">=</span> ethhead <span style="color: #339933;">+</span> <span style="color: #0000dd;">14</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">//ip head point</span>
		p <span style="color: #339933;">=</span> iphead <span style="color: #339933;">+</span> <span style="color: #0000dd;">12</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//ip address</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;IP:%d.%d.%d.%d==&gt;%d.%d.%d.%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> \
			p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		proto <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>iphead <span style="color: #339933;">+</span> <span style="color: #0000dd;">9</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">//ip protocol</span>
		p <span style="color: #339933;">=</span> iphead <span style="color: #339933;">+</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//ip port </span>
		<span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span>proto<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">case</span> IPPROTO_ICMP<span style="color: #339933;">:</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: ICMP<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">case</span> IPPROTO_IGMP<span style="color: #339933;">:</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: IGMP<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">case</span> IPPROTO_IPIP<span style="color: #339933;">:</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: IPIP<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">case</span> IPPROTO_TCP<span style="color: #339933;">:</span>
			<span style="color: #b1b100;">case</span> IPPROTO_UDP<span style="color: #339933;">:</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span>proto <span style="color: #339933;">==</span> IPPROTO_TCP<span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #ff0000;">&quot;TCP&quot;</span><span style="color: #339933;">:</span><span style="color: #ff0000;">&quot;UDP&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			port_s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span><span style="color: #208080;">0XFF00</span> <span style="color: #339933;">|</span> p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&amp;</span><span style="color: #208080;">0XFF</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">//source port</span>
			port_d <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span><span style="color: #208080;">0XFF00</span> <span style="color: #339933;">|</span> p<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&amp;</span><span style="color: #208080;">0XFF</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// dest port</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;source port:%u,&quot;</span><span style="color: #339933;">,</span>port_s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;dest port:%u<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>port_d<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>port_s <span style="color: #339933;">==</span> <span style="color: #0000dd;">80</span> <span style="color: #339933;">||</span> port_d <span style="color: #339933;">==</span> <span style="color: #0000dd;">80</span><span style="color: #009900;">&#41;</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: HTTP<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>port_s <span style="color: #339933;">==</span> <span style="color: #0000dd;">67</span> <span style="color: #339933;">||</span> port_d <span style="color: #339933;">==</span> <span style="color: #0000dd;">67</span><span style="color: #009900;">&#41;</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: DHCP<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>port_s <span style="color: #339933;">==</span> <span style="color: #0000dd;">21</span> <span style="color: #339933;">||</span> port_d <span style="color: #339933;">==</span> <span style="color: #0000dd;">21</span><span style="color: #009900;">&#41;</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: FTP<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>port_s <span style="color: #339933;">==</span> <span style="color: #0000dd;">23</span> <span style="color: #339933;">||</span> port_d <span style="color: #339933;">==</span> <span style="color: #0000dd;">23</span><span style="color: #009900;">&#41;</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: TELNET<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>port_s <span style="color: #339933;">==</span> <span style="color: #0000dd;">53</span> <span style="color: #339933;">||</span> port_d <span style="color: #339933;">==</span> <span style="color: #0000dd;">53</span><span style="color: #009900;">&#41;</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: DNS<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>port_s <span style="color: #339933;">==</span> <span style="color: #0000dd;">137</span> <span style="color: #339933;">||</span> port_d <span style="color: #339933;">==</span> <span style="color: #0000dd;">137</span> <span style="color: #339933;">||</span> port_s <span style="color: #339933;">==</span> <span style="color: #0000dd;">138</span> <span style="color: #339933;">||</span> port_d <span style="color: #339933;">==</span> <span style="color: #0000dd;">138</span><span style="color: #009900;">&#41;</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: NetBIOS/SMB<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">else</span>
				<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol: other<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">case</span> IPPROTO_RAW<span style="color: #339933;">:</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;RAW<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;protocol:unknow(%d)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>proto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>	
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> ch_hanlder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> sockfd<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> len<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> flag_close <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	socklen_t addrlen<span style="color: #339933;">;</span>
	datasend msg_send<span style="color: #339933;">;</span>
	datasend msg_recv<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> sockaddr_in servaddr<span style="color: #339933;">;</span>
&nbsp;
	memset<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg_send<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datasend<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	memset<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg_recv<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datasend<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	bzero<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>servaddr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>servaddr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	msg_send.<span style="color: #202020;">version</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	msg_send.<span style="color: #202020;">type</span> <span style="color: #339933;">=</span> RESPONSE<span style="color: #339933;">;</span>
	sprintf<span style="color: #009900;">&#40;</span>msg_send.<span style="color: #202020;">data</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;received!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	sockfd <span style="color: #339933;">=</span> socket<span style="color: #009900;">&#40;</span>AF_INET<span style="color: #339933;">,</span> SOCK_DGRAM<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
	servaddr.<span style="color: #202020;">sin_family</span> <span style="color: #339933;">=</span> AF_INET<span style="color: #339933;">;</span>
	servaddr.<span style="color: #202020;">sin_addr</span>.<span style="color: #202020;">s_addr</span> <span style="color: #339933;">=</span> htonl<span style="color: #009900;">&#40;</span>INADDR_ANY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	servaddr.<span style="color: #202020;">sin_port</span> <span style="color: #339933;">=</span> htons<span style="color: #009900;">&#40;</span>UDPPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	addrlen <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>bind<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>servaddr<span style="color: #339933;">,</span> addrlen<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;bind error&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		len <span style="color: #339933;">=</span> recvfrom<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>msg_recv<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datasend<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>servaddr<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>addrlen<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;version:%3d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">version</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;type:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">type</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;len:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">len</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;number:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">number</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;data:%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>msg_recv.<span style="color: #202020;">data</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;close&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			sprintf<span style="color: #009900;">&#40;</span>msg_send.<span style="color: #202020;">data</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;close&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			flag_close <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		msg_send.<span style="color: #202020;">number</span> <span style="color: #339933;">=</span> msg_recv.<span style="color: #202020;">number</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		msg_send.<span style="color: #202020;">len</span> <span style="color: #339933;">=</span> randvalue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		sendto<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,&amp;</span>msg_send<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datasend<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>servaddr<span style="color: #339933;">,</span>addrlen<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>flag_close<span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
uint8_t randvalue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	srand<span style="color: #009900;">&#40;</span>time<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>rand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">%</span> <span style="color: #0000dd;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://www.vi1129.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=663&amp;download=zhao_sock_send.c">zhao_sock_send.c</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p66316"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p663code16"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;zhao_sock.h&quot;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> sockfd<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> len<span style="color: #339933;">;</span>
	socklen_t addrlen<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> sockaddr_in cliaddr<span style="color: #339933;">;</span>
	FILE <span style="color: #339933;">*</span>fd<span style="color: #339933;">;</span>
	datasend msg_send<span style="color: #339933;">;</span>
	datasend msg_recv<span style="color: #339933;">;</span>
&nbsp;
	fd <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;/root/zhao_log.txt&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	memset<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg_send<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datasend<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	memset<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg_recv<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datasend<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	bzero<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>cliaddr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>cliaddr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	msg_send.<span style="color: #202020;">version</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	msg_send.<span style="color: #202020;">type</span> <span style="color: #339933;">=</span> REQUEST<span style="color: #339933;">;</span>
	msg_send.<span style="color: #202020;">number</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	msg_send.<span style="color: #202020;">len</span> <span style="color: #339933;">=</span> randvalue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	sockfd <span style="color: #339933;">=</span> socket<span style="color: #009900;">&#40;</span>AF_INET<span style="color: #339933;">,</span> SOCK_DGRAM<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	cliaddr.<span style="color: #202020;">sin_family</span> <span style="color: #339933;">=</span> AF_INET<span style="color: #339933;">;</span>
	cliaddr.<span style="color: #202020;">sin_port</span> <span style="color: #339933;">=</span> htons<span style="color: #009900;">&#40;</span>UDPPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	cliaddr.<span style="color: #202020;">sin_addr</span>.<span style="color: #202020;">s_addr</span> <span style="color: #339933;">=</span> inet_addr<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;127.0.0.1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	addrlen <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;please input send msg:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span>msg_send.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	sendto<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,&amp;</span>msg_send<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datasend<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>cliaddr<span style="color: #339933;">,</span>addrlen<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	len <span style="color: #339933;">=</span> recvfrom<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>msg_recv<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>datasend<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>cliaddr<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>addrlen<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	msg_send.<span style="color: #202020;">number</span> <span style="color: #339933;">=</span> msg_recv.<span style="color: #202020;">number</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	msg_send.<span style="color: #202020;">len</span> <span style="color: #339933;">=</span> randvalue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;version:%3d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">version</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;type:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">type</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;len:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">len</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;number:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">number</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;data:%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	fprintf<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;version:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">version</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fprintf<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;type:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">type</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fprintf<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;len:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">len</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fprintf<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;number:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">number</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fprintf<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;data:%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>msg_recv.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>msg_recv.<span style="color: #202020;">data</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;close&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	fclose<span style="color: #009900;">&#40;</span>fd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
uint8_t randvalue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	srand<span style="color: #009900;">&#40;</span>time<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>rand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">%</span> <span style="color: #0000dd;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p>关联文章:<ol><li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
<li><a href='http://www.vi1129.com/2010/02/node/' rel='bookmark' title='Permanent Link: 自写一则单链表小程序'>自写一则单链表小程序</a></li>
<li><a href='http://www.vi1129.com/2009/06/make-timer-with-signal/' rel='bookmark' title='Permanent Link: 使用setitimer和signal创建一个计时器'>使用setitimer和signal创建一个计时器</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2010/03/sock_raw-dump/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>自写一则单链表小程序</title>
		<link>http://www.vi1129.com/2010/02/node/</link>
		<comments>http://www.vi1129.com/2010/02/node/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 10:22:17 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[链表]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=639</guid>
		<description><![CDATA[<p>发现很多公司面试都喜欢考链表，实际项目中尽管需要自己写链表的时候比较少，但还是会经常用到，链表是一种常用的数据结构。有必要整理一下自己的思路，索性写了一个。包括了链表的初始化，插入，删除，查找，销毁，打印等基本功能，当然考虑了头尾中间等位置情况。仓促完成的简单代码，bug比较多，链表中只存储了一个整形的变量，没有做数据类型的判断，有时候会段错误也难免。已知的一个问题就是创建的链表在有销毁前如果再创建一个的话，会造成内存泄露，因为之前的链表没有销毁头指针便指向了新的位置，旧链表就永远找不到哦。这些问题留在以后实际用到的时候再考虑吧，应付面试这个足矣！</p>

?Download node.c1
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
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
typedef struct node_t &#123;
	int value;
	struct node_t *next;
&#125; node;
#define LENGTH sizeof(node)
&#160;
node *init_node&#40;&#41;&#123;
  int node_length,n=0;
  node *head=NULL;
  node *node_temp1,*node_temp2;
  node_temp2=&#40;node *&#41;malloc&#40;LENGTH&#41;;
  printf&#40;&#34;node length want to create:&#34;&#41;;
  scanf&#40;&#34;%d&#34;,&#38;node_length&#41;;
  if&#40;node_length&#60;1&#41;&#123;
    printf&#40;&#34;no node to create!&#34;&#41;;
    exit&#40;0&#41;;
  &#125;
  while&#40;n&#60;node_length&#41;&#123;
    node_temp1=&#40;node <p><a href="http://www.vi1129.com/2010/02/node/">继续阅读</a></p>


关联文章:<ol><li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2010/01/ioctl-getifaddrs-ipv46/' rel='bookmark' title='Permanent Link: ioctl及getifaddrs读取IPv4,IPv6网卡信息'>ioctl及getifaddrs读取IPv4,IPv6网卡信息</a></li>
<li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>发现很多公司面试都喜欢考链表，实际项目中尽管需要自己写链表的时候比较少，但还是会经常用到，链表是一种常用的数据结构。有必要整理一下自己的思路，索性写了一个。包括了链表的初始化，插入，删除，查找，销毁，打印等基本功能，当然考虑了头尾中间等位置情况。仓促完成的简单代码，bug比较多，链表中只存储了一个整形的变量，没有做数据类型的判断，有时候会段错误也难免。已知的一个问题就是创建的链表在有销毁前如果再创建一个的话，会造成内存泄露，因为之前的链表没有销毁头指针便指向了新的位置，旧链表就永远找不到哦。这些问题留在以后实际用到的时候再考虑吧，应付面试这个足矣！</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://www.vi1129.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=639&amp;download=node.c">node.c</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p63918"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p639code18"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node_t <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> value<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> node_t <span style="color: #339933;">*</span>next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> node<span style="color: #339933;">;</span>
<span style="color: #339933;">#define LENGTH sizeof(node)</span>
&nbsp;
node <span style="color: #339933;">*</span>init_node<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> node_length<span style="color: #339933;">,</span>n<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
  node <span style="color: #339933;">*</span>head<span style="color: #339933;">=</span>NULL<span style="color: #339933;">;</span>
  node <span style="color: #339933;">*</span>node_temp1<span style="color: #339933;">,*</span>node_temp2<span style="color: #339933;">;</span>
  node_temp2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>node <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>LENGTH<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;node length want to create:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>node_length<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>node_length<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;no node to create!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>n<span style="color: #339933;">&lt;</span>node_length<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    node_temp1<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>node <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>LENGTH<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;input NO.%d value:&quot;</span><span style="color: #339933;">,</span>n<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>node_temp1<span style="color: #339933;">-&gt;</span>value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    node_temp1<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">=</span>NULL<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>n<span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
      head<span style="color: #339933;">=</span>node_temp1<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">else</span>
      node_temp2<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">=</span>node_temp1<span style="color: #339933;">;</span>
    node_temp2<span style="color: #339933;">=</span>node_temp1<span style="color: #339933;">;</span>
    n<span style="color: #339933;">++;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> head<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
node <span style="color: #339933;">*</span>insert_node<span style="color: #009900;">&#40;</span>node <span style="color: #339933;">*</span>head<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> insert_value<span style="color: #339933;">;</span>
  node <span style="color: #339933;">*</span>temp_node1<span style="color: #339933;">=</span>head<span style="color: #339933;">;</span>
  node <span style="color: #339933;">*</span>temp_node2<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>node <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>LENGTH<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  node <span style="color: #339933;">*</span>temp_node3<span style="color: #339933;">=</span>NULL<span style="color: #339933;">;</span>
  <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;insert value:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>insert_value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>temp_node1<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>temp_node1<span style="color: #339933;">-&gt;</span>value<span style="color: #339933;">&lt;</span>insert_value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      temp_node3<span style="color: #339933;">=</span>temp_node1<span style="color: #339933;">;</span>
      temp_node1<span style="color: #339933;">=</span>temp_node1<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  temp_node2<span style="color: #339933;">-&gt;</span>value<span style="color: #339933;">=</span>insert_value<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>temp_node3<span style="color: #339933;">==</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #808080; font-style: italic;">/*locate the first node*/</span>
    temp_node3<span style="color: #339933;">=</span>head<span style="color: #339933;">;</span>
    temp_node2<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">=</span>temp_node3<span style="color: #339933;">;</span>
    head<span style="color: #339933;">=</span>temp_node2<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>temp_node1<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>  <span style="color: #808080; font-style: italic;">/*locate the medium of head,insert between temp3 and temp1*/</span>    
    temp_node2<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">=</span>temp_node3<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    temp_node3<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">=</span>temp_node2<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>  <span style="color: #808080; font-style: italic;">/*locate the end of head*/</span>
    temp_node2<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">=</span>NULL<span style="color: #339933;">;</span>
    temp_node3<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">=</span>temp_node2<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> head<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
node <span style="color: #339933;">*</span>delete_node<span style="color: #009900;">&#40;</span>node <span style="color: #339933;">*</span>head<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> del_value<span style="color: #339933;">;</span>
  node <span style="color: #339933;">*</span>temp_node1<span style="color: #339933;">=</span>head<span style="color: #339933;">;</span>
  node <span style="color: #339933;">*</span>temp_node2<span style="color: #339933;">;</span>
  <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;input the delete value:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>del_value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>head<span style="color: #339933;">-&gt;</span>value<span style="color: #339933;">==</span>del_value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #808080; font-style: italic;">/* delete the head of node*/</span>
    temp_node2<span style="color: #339933;">=</span>head<span style="color: #339933;">;</span>
    head<span style="color: #339933;">=</span>head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> head<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>temp_node1<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>temp_node1<span style="color: #339933;">-&gt;</span>value<span style="color: #339933;">!=</span>del_value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      temp_node2<span style="color: #339933;">=</span>temp_node1<span style="color: #339933;">;</span>
      temp_node1<span style="color: #339933;">=</span>temp_node1<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>temp_node1<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    temp_node2<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">=</span>temp_node1<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    free<span style="color: #009900;">&#40;</span>temp_node1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;not find what you want to delete!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> head<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> search_node<span style="color: #009900;">&#40;</span>node <span style="color: #339933;">*</span>head<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> search_value<span style="color: #339933;">,</span>n<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  node <span style="color: #339933;">*</span>temp_node<span style="color: #339933;">=</span>head<span style="color: #339933;">;</span>
  <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;insert the value which you find:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>search_value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>temp_node<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>temp_node<span style="color: #339933;">-&gt;</span>value<span style="color: #339933;">!=</span>search_value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      temp_node<span style="color: #339933;">=</span>temp_node<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
      n<span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>temp_node<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;finded what you want.<span style="color: #000099; font-weight: bold;">\n</span>the %d node`s value:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>n<span style="color: #339933;">,</span>temp_node<span style="color: #339933;">-&gt;</span>value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">else</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;not find!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> print_node<span style="color: #009900;">&#40;</span>node <span style="color: #339933;">*</span>head<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>head<span style="color: #339933;">==</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;blank node!create first please!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  node <span style="color: #339933;">*</span>temp_node<span style="color: #339933;">=</span>head<span style="color: #339933;">;</span> 
  <span style="color: #b1b100;">do</span><span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;value:%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>temp_node<span style="color: #339933;">-&gt;</span>value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    temp_node<span style="color: #339933;">=</span>temp_node<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>temp_node<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
node <span style="color: #339933;">*</span>destroy_node<span style="color: #009900;">&#40;</span>node <span style="color: #339933;">*</span>head<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>head<span style="color: #339933;">==</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;blank node!create first please!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  node <span style="color: #339933;">*</span>temp_node<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">do</span><span style="color: #009900;">&#123;</span>
    temp_node<span style="color: #339933;">=</span>head<span style="color: #339933;">-&gt;</span>next<span style="color: #339933;">;</span>
    free<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    head<span style="color: #339933;">=</span>temp_node<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>head<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> head<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> options<span style="color: #339933;">;</span>
  node <span style="color: #339933;">*</span>head<span style="color: #339933;">=</span>NULL<span style="color: #339933;">;</span>
loop<span style="color: #339933;">:</span>
  <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;select options:<span style="color: #000099; font-weight: bold;">\t</span>1:create 2:insert 3:delete 4:find 5:print 6:destory 7:exit<span style="color: #000099; font-weight: bold;">\n</span>input options:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,&amp;</span>options<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span>options<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">:</span>
      head<span style="color: #339933;">=</span>init_node<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">:</span>
      head<span style="color: #339933;">=</span>insert_node<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">:</span>
      head<span style="color: #339933;">=</span>delete_node<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">:</span>
      search_node<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">:</span>
      print_node<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">:</span>
      head<span style="color: #339933;">=</span>destroy_node<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">7</span><span style="color: #339933;">:</span>
      <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;byebye!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
      <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;invalid options!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">goto</span> loop<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p>关联文章:<ol><li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2010/01/ioctl-getifaddrs-ipv46/' rel='bookmark' title='Permanent Link: ioctl及getifaddrs读取IPv4,IPv6网卡信息'>ioctl及getifaddrs读取IPv4,IPv6网卡信息</a></li>
<li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2010/02/node/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ioctl及getifaddrs读取IPv4,IPv6网卡信息</title>
		<link>http://www.vi1129.com/2010/01/ioctl-getifaddrs-ipv46/</link>
		<comments>http://www.vi1129.com/2010/01/ioctl-getifaddrs-ipv46/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 09:14:30 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[getifaddrs]]></category>
		<category><![CDATA[ioctl]]></category>
		<category><![CDATA[IPv6]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=617</guid>
		<description><![CDATA[<p>使用ioctl的SIOCGIFCONF可以读取所有网卡信息。ioctl调用后返回指向ifconf的结构链表，其中包含了指向ifreq的结构指针。ifconf及ifreq定义在net/if.h中。</p>
<p>《UNIX网络编程》中提供了get_ifi_info函数的实现方法，使用这种方式来获取网络信息。在LINUX下，这种方式不能获得IPV6的网卡信息。《UNIX网络编程》中有如下描述：</p>
<p>在支持IPV6的系统中，没有关于对SIOCGIFCONF请求是否返回IPV6地址的标准。我们给支持IPV6的新系统增加了一个case语句， 这是为了预防万一。问题在于ifreq中的联合把返回的地址定义成一个通用的16字节套接口地址结构，适合16字节的IPV4 socket_in结构，但对于24字节的IPV6 socket_in6结构太小了。如果返回IPV6地址，将可能破环现有的在每个ifreq结构中采用固定大小的套接口地址结构的代码。</p>
<p>经测试，在fedor6-2.6.18kernel中无法返回ipv6地址，事实上，返回的地址簇总是AF_INET,而并非AF_INET6。
这种方法的实现代码如下：

net_if.h</p>

?View Code C1
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
#ifndef __NET_INF_H
#define __NET_INF_H
&#160;
#include &#60;net/if.h&#62;
#include &#60;stdio.h&#62;
#include &#60;errno.h&#62;
#include &#60;unistd.h&#62;
#include &#60;netinet/in.h&#62;
#include &#60;sys/ioctl.h&#62;
#include &#60;stdlib.h&#62;
#include &#60;string.h&#62;
#include &#60;sys/types.h&#62;
#include &#60;sys/socket.h&#62;
#include &#60;arpa/inet.h&#62;
&#160;
#define IFI_NAME 16
#define IFI_HADDR 8
&#160;
typedef struct ifi_info
&#123;
  char ifi_name&#91;IFI_NAME&#93;;
  u_char ifi_haddr&#91;IFI_HADDR&#93;;
  u_short ifi_hlen;
  short ifi_flags;
  short ifi_myflags;
  struct sockaddr *ifi_addr;
  struct sockaddr *ifi_brdaddr;
  struct sockaddr *ifi_dstaddr;
  struct ifi_info <p><a href="http://www.vi1129.com/2010/01/ioctl-getifaddrs-ipv46/">继续阅读</a></p>


关联文章:<ol><li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2010/02/node/' rel='bookmark' title='Permanent Link: 自写一则单链表小程序'>自写一则单链表小程序</a></li>
<li><a href='http://www.vi1129.com/2009/06/snmp-trap/' rel='bookmark' title='Permanent Link: 一种IP改变唤醒SNMP TRAP的实现源码'>一种IP改变唤醒SNMP TRAP的实现源码</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>使用ioctl的SIOCGIFCONF可以读取所有网卡信息。ioctl调用后返回指向ifconf的结构链表，其中包含了指向ifreq的结构指针。ifconf及ifreq定义在net/if.h中。</p>
<p>《UNIX网络编程》中提供了get_ifi_info函数的实现方法，使用这种方式来获取网络信息。在LINUX下，这种方式不能获得IPV6的网卡信息。《UNIX网络编程》中有如下描述：</p>
<blockquote><p>在支持IPV6的系统中，没有关于对SIOCGIFCONF请求是否返回IPV6地址的标准。我们给支持IPV6的新系统增加了一个case语句， 这是为了预防万一。问题在于ifreq中的联合把返回的地址定义成一个通用的16字节套接口地址结构，适合16字节的IPV4 socket_in结构，但对于24字节的IPV6 socket_in6结构太小了。如果返回IPV6地址，将可能破环现有的在每个ifreq结构中采用固定大小的套接口地址结构的代码。</p></blockquote>
<p>经测试，在fedor6-2.6.18kernel中无法返回ipv6地址，事实上，返回的地址簇总是AF_INET,而并非AF_INET6。<br />
这种方法的实现代码如下：<br />
<span id="more-617"></span><br />
net_if.h</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p617code23'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p61723"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p617code23"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef __NET_INF_H</span>
<span style="color: #339933;">#define __NET_INF_H</span>
&nbsp;
<span style="color: #339933;">#include &lt;net/if.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;errno.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #339933;">#include &lt;netinet/in.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/ioctl.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/types.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/socket.h&gt;</span>
<span style="color: #339933;">#include &lt;arpa/inet.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define IFI_NAME 16</span>
<span style="color: #339933;">#define IFI_HADDR 8</span>
&nbsp;
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> ifi_info
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span> ifi_name<span style="color: #009900;">&#91;</span>IFI_NAME<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  u_char ifi_haddr<span style="color: #009900;">&#91;</span>IFI_HADDR<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  u_short ifi_hlen<span style="color: #339933;">;</span>
  <span style="color: #993333;">short</span> ifi_flags<span style="color: #339933;">;</span>
  <span style="color: #993333;">short</span> ifi_myflags<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> sockaddr <span style="color: #339933;">*</span>ifi_addr<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> sockaddr <span style="color: #339933;">*</span>ifi_brdaddr<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> sockaddr <span style="color: #339933;">*</span>ifi_dstaddr<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> ifi_info <span style="color: #339933;">*</span>ifi_next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>ifi_info<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#define IFI_ALIAS 1</span>
&nbsp;
<span style="color: #993333;">struct</span> ifi_info <span style="color: #339933;">*</span>get_ifi_info<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> free_ifi_info<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ifi_info <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#endif</span></pre></td></tr></table></div>

<p>net_if.c</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p617code24'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p61724"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
</pre></td><td class="code" id="p617code24"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;net_if.h&quot;</span>
&nbsp;
ifi_info <span style="color: #339933;">*</span>get_ifi_info<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> family<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> doaliases<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  ifi_info <span style="color: #339933;">*</span>ifi<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ifihead<span style="color: #339933;">,</span> <span style="color: #339933;">**</span>ifipnext<span style="color: #339933;">;</span>
  <span style="color: #993333;">int</span> sockfd<span style="color: #339933;">,</span> len<span style="color: #339933;">,</span> lastlen<span style="color: #339933;">,</span> flags<span style="color: #339933;">,</span> myflags<span style="color: #339933;">;</span>
  <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>ptr<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">,</span> lastname<span style="color: #009900;">&#91;</span>IFNAMSIZ<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>cptr<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> ifconf ifc<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> ifreq <span style="color: #339933;">*</span>ifr<span style="color: #339933;">,</span> ifrcopy<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> sockaddr_in <span style="color: #339933;">*</span>sinptr<span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">=</span>socket<span style="color: #009900;">&#40;</span>family<span style="color: #339933;">,</span> SOCK_DGRAM<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;socket error.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  lastlen <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
  len <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ifreq<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    buf <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ifc.<span style="color: #202020;">ifc_len</span> <span style="color: #339933;">=</span> len<span style="color: #339933;">;</span>
    ifc.<span style="color: #202020;">ifc_buf</span> <span style="color: #339933;">=</span> buf<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioctl<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span> SIOCGIFCONF<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ifc<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>errno<span style="color: #339933;">!=</span>EINVAL<span style="color: #339933;">||</span>lastlen<span style="color: #339933;">!=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
        <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ioctl error.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifc.<span style="color: #202020;">ifc_len</span> <span style="color: #339933;">==</span> lastlen<span style="color: #009900;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
      lastlen <span style="color: #339933;">=</span> ifc.<span style="color: #202020;">ifc_len</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    len <span style="color: #339933;">+=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ifreq<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    free<span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  ifihead <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
  ifipnext <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>ifihead<span style="color: #339933;">;</span>
  lastname<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>ptr <span style="color: #339933;">=</span> buf<span style="color: #339933;">;</span> ptr<span style="color: #339933;">&lt;</span>buf<span style="color: #339933;">+</span>ifc.<span style="color: #202020;">ifc_len</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    ifr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ifreq<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>ptr<span style="color: #339933;">;</span>
<span style="color: #339933;">#ifdef HAVE_SOCKADDR_SA_LEN</span>
    len <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;</span>ifr<span style="color: #339933;">-&gt;</span>ifr_addr.<span style="color: #202020;">sa_len</span><span style="color: #339933;">?</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>ifr<span style="color: #339933;">-&gt;</span>ifr_addr.<span style="color: #202020;">sa_len</span><span style="color: #339933;">;</span>
<span style="color: #339933;">#else</span>
    <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>ifr<span style="color: #339933;">-&gt;</span>ifr_addr.<span style="color: #202020;">sa_family</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
<span style="color: #339933;">#ifdef IPV6</span>
    <span style="color: #b1b100;">case</span> AF_INET6<span style="color: #339933;">:</span>
      len <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in6<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #339933;">#endif</span>
    <span style="color: #b1b100;">case</span> AF_INET<span style="color: #339933;">:</span>
    <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
      len <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #339933;">#endif</span>
&nbsp;
    ptr <span style="color: #339933;">+=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>ifr<span style="color: #339933;">-&gt;</span>ifr_name<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> len<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifr<span style="color: #339933;">-&gt;</span>ifr_addr.<span style="color: #202020;">sa_family</span> <span style="color: #339933;">!=</span> family<span style="color: #009900;">&#41;</span>
      <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
&nbsp;
    myflags <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>cptr<span style="color: #339933;">=</span>strchr<span style="color: #009900;">&#40;</span>ifr<span style="color: #339933;">-&gt;</span>ifr_name<span style="color: #339933;">,</span> <span style="color: #ff0000;">':'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">*</span>cptr <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strncmp<span style="color: #009900;">&#40;</span>lastname<span style="color: #339933;">,</span> ifr<span style="color: #339933;">-&gt;</span>ifr_name<span style="color: #339933;">,</span> IFNAMSIZ<span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>doaliases <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
      myflags <span style="color: #339933;">=</span> IFI_ALIAS<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    memcpy<span style="color: #009900;">&#40;</span>lastname<span style="color: #339933;">,</span> ifr<span style="color: #339933;">-&gt;</span>ifr_name<span style="color: #339933;">,</span> IFNAMSIZ<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    ifrcopy <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>ifr<span style="color: #339933;">;</span>
    ioctl<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span> SIOCGIFFLAGS<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ifrcopy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    flags <span style="color: #339933;">=</span> ifrcopy.<span style="color: #202020;">ifr_flags</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>flags<span style="color: #339933;">&amp;</span>IFF_UP<span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
      <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
    <span style="color: #808080; font-style: italic;">/*
    if ((flags&amp;IFF_BROADCAST)==0)
      continue;
    */</span>
    ifi <span style="color: #339933;">=</span> calloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ifi_info<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #339933;">*</span>ifipnext <span style="color: #339933;">=</span> ifi<span style="color: #339933;">;</span>
    ifipnext <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_next<span style="color: #339933;">;</span>
    ifi<span style="color: #339933;">-&gt;</span>ifi_flags <span style="color: #339933;">=</span> flags<span style="color: #339933;">;</span>
    ifi<span style="color: #339933;">-&gt;</span>ifi_myflags <span style="color: #339933;">=</span> myflags<span style="color: #339933;">;</span>
    memcpy<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_name<span style="color: #339933;">,</span> ifr<span style="color: #339933;">-&gt;</span>ifr_name<span style="color: #339933;">,</span> IFI_NAME<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ifi<span style="color: #339933;">-&gt;</span>ifi_name<span style="color: #009900;">&#91;</span>IFI_NAME<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>ifr<span style="color: #339933;">-&gt;</span>ifr_addr.<span style="color: #202020;">sa_family</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">case</span> AF_INET<span style="color: #339933;">:</span>
      sinptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>ifr<span style="color: #339933;">-&gt;</span>ifr_addr<span style="color: #339933;">;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
        ifi<span style="color: #339933;">-&gt;</span>ifi_addr <span style="color: #339933;">=</span> calloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        memcpy<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #339933;">,</span> sinptr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">#ifdef SIOCGIFBRDADDR</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>flags <span style="color: #339933;">&amp;</span> IFF_BROADCAST<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
          ioctl<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span> SIOCGIFBRDADDR<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ifrcopy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          sinptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>ifrcopy.<span style="color: #202020;">ifr_broadaddr</span><span style="color: #339933;">;</span>
          ifi<span style="color: #339933;">-&gt;</span>ifi_brdaddr <span style="color: #339933;">=</span> calloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          memcpy<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_brdaddr<span style="color: #339933;">,</span> sinptr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #339933;">#endif</span>
<span style="color: #339933;">#ifdef SIOCGIFDSTADDR</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>flags <span style="color: #339933;">&amp;</span> IFF_POINTOPOINT<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
          ioctl<span style="color: #009900;">&#40;</span>sockfd<span style="color: #339933;">,</span> SIOCGIFDSTADDR<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ifrcopy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          sinptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>ifrcopy.<span style="color: #202020;">ifr_dstaddr</span><span style="color: #339933;">;</span>
          ifi<span style="color: #339933;">-&gt;</span>ifi_dstaddr <span style="color: #339933;">=</span> calloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          memcpy<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_dstaddr<span style="color: #339933;">,</span> sinptr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #339933;">#endif</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
      <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  free<span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span>ifihead<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> free_ifi_info<span style="color: #009900;">&#40;</span>ifi_info <span style="color: #339933;">*</span>ifihead<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  ifi_info <span style="color: #339933;">*</span>ifi<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ifinext<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">=</span>ifihead<span style="color: #339933;">;</span> ifi<span style="color: #339933;">!=</span>NULL<span style="color: #339933;">;</span> ifi<span style="color: #339933;">=</span>ifinext<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span>
      free<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_brdaddr<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span>
      free<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_brdaddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_dstaddr<span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span>
      free<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_dstaddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ifinext <span style="color: #339933;">=</span> ifi<span style="color: #339933;">-&gt;</span>ifi_next<span style="color: #339933;">;</span>
&nbsp;
    free<span style="color: #009900;">&#40;</span>ifi<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">char</span> <span style="color: #339933;">*</span>sock_ntop<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">struct</span> sockaddr <span style="color: #339933;">*</span>sa<span style="color: #339933;">,</span> socklen_t salen<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span> portstr<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">static</span> <span style="color: #993333;">char</span> str<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">128</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>sa<span style="color: #339933;">-&gt;</span>sa_family<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">case</span> AF_INET<span style="color: #339933;">:</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #993333;">struct</span> sockaddr_in <span style="color: #339933;">*</span>sin <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>sa<span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>inet_ntop<span style="color: #009900;">&#40;</span>AF_INET<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>sin<span style="color: #339933;">-&gt;</span>sin_addr<span style="color: #339933;">,</span> str<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span>NULL<span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ntohs<span style="color: #009900;">&#40;</span>sin<span style="color: #339933;">-&gt;</span>sin_port<span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
        snprintf<span style="color: #009900;">&#40;</span>portstr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>portstr<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;.%d&quot;</span><span style="color: #339933;">,</span> ntohs<span style="color: #009900;">&#40;</span>sin<span style="color: #339933;">-&gt;</span>sin_port<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        strcat<span style="color: #009900;">&#40;</span>str<span style="color: #339933;">,</span> portstr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #b1b100;">return</span> str<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">case</span> AF_INET6<span style="color: #339933;">:</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #993333;">struct</span> sockaddr_in6 <span style="color: #339933;">*</span>sin <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in6 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>sa<span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>inet_ntop<span style="color: #009900;">&#40;</span>AF_INET6<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>sin<span style="color: #339933;">-&gt;</span>sin6_addr<span style="color: #339933;">,</span> str<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span>NULL<span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ntohs<span style="color: #009900;">&#40;</span>sin<span style="color: #339933;">-&gt;</span>sin6_port<span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
        snprintf<span style="color: #009900;">&#40;</span>portstr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>portstr<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;.%d&quot;</span><span style="color: #339933;">,</span> ntohs<span style="color: #009900;">&#40;</span>sin<span style="color: #339933;">-&gt;</span>sin6_port<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        strcat<span style="color: #009900;">&#40;</span>str<span style="color: #339933;">,</span> portstr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #b1b100;">return</span> str<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
    <span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  ifi_info <span style="color: #339933;">*</span>ifi<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ifihead<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> sockaddr <span style="color: #339933;">*</span>sa<span style="color: #339933;">;</span>
  u_char <span style="color: #339933;">*</span>ptr<span style="color: #339933;">;</span>
  <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> family<span style="color: #339933;">,</span> doaliases<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>argc<span style="color: #339933;">!=</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;usage: ./prifinfo &lt;inet4 | inet 6&gt; &lt;doaliases&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;inet4&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    family <span style="color: #339933;">=</span> AF_INET<span style="color: #339933;">;</span>
<span style="color: #339933;">#ifdef IPV6</span>
  <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;inet6&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    family <span style="color: #339933;">=</span>AF_INET6<span style="color: #339933;">;</span>
<span style="color: #339933;">#endif</span>
  <span style="color: #b1b100;">else</span>
  <span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;invalid &lt;address-family&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  doaliases <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>ifihead <span style="color: #339933;">=</span> ifi <span style="color: #339933;">=</span> get_ifi_info<span style="color: #009900;">&#40;</span>family<span style="color: #339933;">,</span> doaliases<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      ifi<span style="color: #339933;">!=</span>NULL<span style="color: #339933;">;</span>ifi<span style="color: #339933;">=</span>ifi<span style="color: #339933;">-&gt;</span>ifi_next<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s:&lt;&quot;</span><span style="color: #339933;">,</span> ifi<span style="color: #339933;">-&gt;</span>ifi_name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_flags<span style="color: #339933;">&amp;</span>IFF_UP<span style="color: #009900;">&#41;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;UP&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_flags<span style="color: #339933;">&amp;</span>IFF_BROADCAST<span style="color: #009900;">&#41;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;BCAST&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_flags<span style="color: #339933;">&amp;</span>IFF_MULTICAST<span style="color: #009900;">&#41;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;MCAST&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_flags<span style="color: #339933;">&amp;</span>IFF_LOOPBACK<span style="color: #009900;">&#41;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;LOOP&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_flags<span style="color: #339933;">&amp;</span>IFF_POINTOPOINT<span style="color: #009900;">&#41;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;P2P&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span>ifi<span style="color: #339933;">-&gt;</span>ifi_hlen<span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      ptr <span style="color: #339933;">=</span> ifi<span style="color: #339933;">-&gt;</span>ifi_haddr<span style="color: #339933;">;</span>
      <span style="color: #b1b100;">do</span>
      <span style="color: #009900;">&#123;</span>
        <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s%x&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">==</span>ifi<span style="color: #339933;">-&gt;</span>ifi_hlen<span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span><span style="color: #ff0000;">&quot; &quot;</span><span style="color: #339933;">:</span><span style="color: #ff0000;">&quot;:&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ptr<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">--</span>i<span style="color: #339933;">&gt;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>sa<span style="color: #339933;">=</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span>
      <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot; IP addr: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>
             sock_ntop<span style="color: #009900;">&#40;</span>sa<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>sa<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>sa<span style="color: #339933;">=</span>ifi<span style="color: #339933;">-&gt;</span>ifi_brdaddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span>
      <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot; broadcast addr: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>
             sock_ntop<span style="color: #009900;">&#40;</span>sa<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>sa<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>sa<span style="color: #339933;">=</span>ifi<span style="color: #339933;">-&gt;</span>ifi_dstaddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span>NULL<span style="color: #009900;">&#41;</span>
      <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot; destnation addr: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>
             sock_ntop<span style="color: #009900;">&#40;</span>sa<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>sa<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  free_ifi_info<span style="color: #009900;">&#40;</span>ifihead<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>使用gcc net_if.c -o net_if -DIPV6编译，在IPV4模式下运行输出为：</p>
<blockquote><p>[root@localhost net_if]./net_if inet4 1<br />
lo:<UPLOOP><br />
IP addr: 127.0.0.1<br />
eth1:<UPBCASTMCAST><br />
IP addr: 192.168.1.2<br />
broadcast addr: 192.168.1.255<br />
eth0:<UPBCASTMCAST><br />
IP addr: 192.168.125.99<br />
broadcast addr: 192.168.125.255</p></blockquote>
<p>执行./net_if inet6 1在输出为空。</p>
<p>第二种方式是使用getifaddrs函数获取，需要包含ifaddrs.h头文件，这种方式可以获得IPV6地址，改写的《UNIX网络编程》中的get_ifi_info函数如下所示：</p>
<p>znet.h</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p617code25'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p61725"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p617code25"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef __ZNET_H__</span>
<span style="color: #339933;">#define __ZNET_H__</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/socket.h&gt;</span>
<span style="color: #339933;">#include &lt;arpa/inet.h&gt;</span>
<span style="color: #339933;">#include &lt;net/if.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/ioctl.h&gt;</span>
<span style="color: #339933;">#include &lt;ifaddrs.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define	IFI_NAME	16			/* same as IFNAMSIZ in &lt;net/if.h&gt; */</span>
<span style="color: #339933;">#define	IFI_HADDR	 8			/* allow for 64-bit EUI-64 in future */</span>
&nbsp;
<span style="color: #993333;">struct</span> ifi_info <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span>    ifi_name<span style="color: #009900;">&#91;</span>IFI_NAME<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>	<span style="color: #808080; font-style: italic;">/* interface name, null-terminated */</span>
  <span style="color: #993333;">short</span>   ifi_index<span style="color: #339933;">;</span>			<span style="color: #808080; font-style: italic;">/* interface index */</span>
  <span style="color: #993333;">short</span>   ifi_flags<span style="color: #339933;">;</span>			<span style="color: #808080; font-style: italic;">/* IFF_xxx constants from &lt;net/if.h&gt; */</span>
  <span style="color: #993333;">struct</span> sockaddr  <span style="color: #339933;">*</span>ifi_addr<span style="color: #339933;">;</span>	<span style="color: #808080; font-style: italic;">/* primary address */</span>
  <span style="color: #993333;">struct</span> sockaddr  <span style="color: #339933;">*</span>ifi_brdaddr<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/* broadcast address */</span>
  <span style="color: #993333;">struct</span> ifi_info  <span style="color: #339933;">*</span>ifi_next<span style="color: #339933;">;</span>	<span style="color: #808080; font-style: italic;">/* next of these structures */</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> ifi_info<span style="color: #339933;">*</span> get_ifi_info<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> free_ifi_info<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ifi_info <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#endif</span></pre></td></tr></table></div>

<p>znet.c</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p617code26'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p61726"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p617code26"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;znet.h&quot;</span>
&nbsp;
<span style="color: #993333;">struct</span> ifi_info<span style="color: #339933;">*</span> get_ifi_info<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> family<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> doaliases<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">struct</span> ifi_info		<span style="color: #339933;">*</span>ifi<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ifihead<span style="color: #339933;">,</span> <span style="color: #339933;">**</span>ifipnext<span style="color: #339933;">,*</span>p<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> sockaddr_in	<span style="color: #339933;">*</span>sinptr<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> sockaddr_in6	<span style="color: #339933;">*</span>sin6ptr<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> ifaddrs <span style="color: #339933;">*</span>ifas<span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//	char addr[128];</span>
	<span style="color: #993333;">int</span> sockfd<span style="color: #339933;">;</span>
&nbsp;
	ifihead <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
	ifipnext <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>ifihead<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>getifaddrs<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>ifas<span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span>ifas<span style="color: #339933;">!=</span>NULL<span style="color: #339933;">;</span>ifas<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ifas<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">ifa_next</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ifas<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">ifa_addr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>sa_family <span style="color: #339933;">!=</span> family<span style="color: #009900;">&#41;</span>
			<span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">// ignore if not desired address family</span>
<span style="color: #808080; font-style: italic;">/*
		printf(&quot;%s %d\n&quot;,(*ifas).ifa_name,((*ifas).ifa_addr)-&gt;sa_family);
		if(((*ifas).ifa_addr)-&gt;sa_family!=AF_INET6)
			inet_ntop(AF_INET,&amp;(((struct sockaddr_in *)((*ifas).ifa_addr))-&gt;sin_addr),addr,sizeof(addr));
		else
			inet_ntop(AF_INET6,&amp;(((struct sockaddr_in6 *)((*ifas).ifa_addr))-&gt;sin6_addr),addr,sizeof(addr));
		printf(&quot;%s\t&quot;,addr);
		printf(&quot;\n&quot;);
*/</span>		
		ifi <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ifi_info<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>calloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ifi_info<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #339933;">*</span>ifipnext <span style="color: #339933;">=</span> ifi<span style="color: #339933;">;</span>			
		ifipnext <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_next<span style="color: #339933;">;</span>	
&nbsp;
		ifi<span style="color: #339933;">-&gt;</span>ifi_flags <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ifas<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">ifa_flags</span><span style="color: #339933;">;</span>
		memcpy<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_name<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ifas<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">ifa_name</span><span style="color: #339933;">,</span> IFI_NAME<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		ifi<span style="color: #339933;">-&gt;</span>ifi_name<span style="color: #009900;">&#91;</span>IFI_NAME<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ifas<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">ifa_addr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>sa_family<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">case</span> AF_INET<span style="color: #339933;">:</span> 
				sinptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ifas<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">ifa_addr</span><span style="color: #339933;">;</span>
				ifi<span style="color: #339933;">-&gt;</span>ifi_addr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>calloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				memcpy<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #339933;">,</span> sinptr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>			
<span style="color: #339933;">#ifdef	SIOCGIFBRDADDR</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_flags <span style="color: #339933;">&amp;</span> IFF_BROADCAST<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					sinptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ifas<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">ifa_broadaddr</span><span style="color: #339933;">;</span>
					ifi<span style="color: #339933;">-&gt;</span>ifi_brdaddr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>calloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					memcpy<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_brdaddr<span style="color: #339933;">,</span> sinptr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">#endif</span>
				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> 
&nbsp;
			<span style="color: #b1b100;">case</span> AF_INET6<span style="color: #339933;">:</span> 
				sin6ptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in6 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ifas<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">ifa_addr</span><span style="color: #339933;">;</span>
				ifi<span style="color: #339933;">-&gt;</span>ifi_addr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>calloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in6<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				memcpy<span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #339933;">,</span> sin6ptr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in6<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> 
&nbsp;
			<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	freeifaddrs<span style="color: #009900;">&#40;</span>ifas<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
&nbsp;
	<span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span>ifihead<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> family<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>argc<span style="color: #339933;">!=</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;usage: ./znet &lt;inet4 | inet 6&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;inet4&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		family <span style="color: #339933;">=</span> AF_INET<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strcmp<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;inet6&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		family <span style="color: #339933;">=</span>AF_INET6<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;invalid &lt;address-family&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #993333;">char</span> addr<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">128</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> ifi_info	<span style="color: #339933;">*</span>ifi<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ifihead<span style="color: #339933;">;</span>
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;name<span style="color: #000099; font-weight: bold;">\t</span>flag<span style="color: #000099; font-weight: bold;">\t</span>IP<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>broadcastaddr<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>ifihead <span style="color: #339933;">=</span> ifi <span style="color: #339933;">=</span> get_ifi_info<span style="color: #009900;">&#40;</span>family<span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> ifi <span style="color: #339933;">!=</span> NULL<span style="color: #339933;">;</span> ifi <span style="color: #339933;">=</span> ifi<span style="color: #339933;">-&gt;</span>ifi_next<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span>ifi<span style="color: #339933;">-&gt;</span>ifi_name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span>ifi<span style="color: #339933;">-&gt;</span>ifi_flags<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>sa_family<span style="color: #339933;">!=</span>AF_INET6<span style="color: #009900;">&#41;</span>
			inet_ntop<span style="color: #009900;">&#40;</span>AF_INET<span style="color: #339933;">,&amp;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>sin_addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>addr<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>addr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">else</span>
			inet_ntop<span style="color: #009900;">&#40;</span>AF_INET6<span style="color: #339933;">,&amp;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in6 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>sin6_addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>addr<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>addr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span>addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">#ifdef	SIOCGIFBRDADDR</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_flags <span style="color: #339933;">&amp;</span> IFF_BROADCAST<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>sa_family<span style="color: #339933;">!=</span>AF_INET6<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			inet_ntop<span style="color: #009900;">&#40;</span>AF_INET<span style="color: #339933;">,&amp;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr_in <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>ifi<span style="color: #339933;">-&gt;</span>ifi_brdaddr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>sin_addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>addr<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>addr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span>addr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">#endif			</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>+++++++++++++++++++++++++++++++++++++++++++<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>这段代码输出如下：</p>
<blockquote><p>[root@localhost net_if]./znet inet4<br />
name    flag    IP    broadcastaddr<br />
lo         73     127.0.0.1<br />
++++++++++++++++++++++++++++++<br />
eth1     4099   192.168.1.2     192.168.1.255<br />
++++++++++++++++++++++++++++++<br />
eth0     4163   192.168.125.99     192.168.125.255<br />
++++++++++++++++++++++++++++++<br />
[root@localhost net_if]./znet inet6<br />
name    flag    IP    broadcastaddr<br />
lo         73     ::1<br />
++++++++++++++++++++++++++++++<br />
eth1     4163   2001:250:1800:1::1<br />
++++++++++++++++++++++++++++++<br />
eth0     4163   2001:250:1888:1::1<br />
++++++++++++++++++++++++++++++</p></blockquote>


<p>关联文章:<ol><li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2010/02/node/' rel='bookmark' title='Permanent Link: 自写一则单链表小程序'>自写一则单链表小程序</a></li>
<li><a href='http://www.vi1129.com/2009/06/snmp-trap/' rel='bookmark' title='Permanent Link: 一种IP改变唤醒SNMP TRAP的实现源码'>一种IP改变唤醒SNMP TRAP的实现源码</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2010/01/ioctl-getifaddrs-ipv46/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于const与指针搭配使用的一点记录</title>
		<link>http://www.vi1129.com/2010/01/const-ptr/</link>
		<comments>http://www.vi1129.com/2010/01/const-ptr/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 05:26:22 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[const]]></category>
		<category><![CDATA[指针]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=601</guid>
		<description><![CDATA[<p>const限定符指定了一个变量为只读变量，是不允许被改变的，因此const变量在定义时就必须初始化。
const在与指针搭配时，使用将变的复杂和微妙。简单的说const搭配指针就会出现以下三种情况：</p>

指向const变量(对象)的指针
const指针
指向const变量(对象)的const指针

<p>1.指向const变量(对象)的指针
指针指向了const变量，例如 const int *ptr或者int const *ptr，这两种写法含义一样，这表示const限定了ptr所指向的数据类型，而并非ptr本身。即ptr本身并不是const.可以对ptr重新赋值，无需在定义时初始化。
指向const变量的指针可以指向一个const变量，也可以指向一个非const变量，当然指针类型与变量类型要一致。不管指向了一个const变量还是非const变量，任何企图通过这个指针去修改变量的值都会导致编译错误。同时，const变量只能赋给指向const变量的指针，赋给一个普通变量也是不允许的。
如（代码仅供理解const,不要刻意追求是否正确可执行）：</p>
<p>const int *ptr;
int *ptr_1;
const int a=12;
const int b=13;
int c=14;
ptr=&#38;a;/*指向const变量*/
ptr=&#38;b;/*重新赋值指向const变量*/
*ptr=20;/*error,不能通过ptr修改*/
ptr=&#38;c;/*重新赋值指向非const变量*/
ptr_1=&#38;c;/*普通指针指向普通变量*/
ptr_1=&#38;a;/*error，普通指针不能指向const变量*/</p>
<p>《C++ Primer》中对此有详细的解释，尽管不能通过指向const对象的指针去修改基础对象，然而如果该指针指向的是一个非const对象，可以用其他方法修改所指的对象。如下的例子：</p>
<p>const int *ptr;
int *ptr_1;
int c=14;
ptr=&#38;c;
printf(&#8221;c=%d\n&#8221;,*ptr);
ptr_1=&#38;c;
*ptr_1=18/*通过非指向const的指针修改*/
printf(&#8221;c=%d\n&#8221;,*ptr);</p>
<p>输出结果可以看到两次输出是不一样的。对此，《C++ Primer》中说，如果把指向const的指针理解为“自以为指向const的指针”，这可能会对理解有所帮助。</p>
<p>2.const指针</p>
<p>int a=12;
int *const ptr=&#38;a</p>
<p>这意味着ptr这个指针被定义成const变量，必须在定义时初始化，并不能重新对ptr赋值，即不能将ptr再指向其他变量。但是，*ptr=13，这样的操作完全取决与a是不是一个const变量，在这个例子中不是，所以*ptr=13是正确的，假如a这样定义，const int a=12,*ptr=13会导致错误。</p>
<p>3.指向const变量(对象)的const指针</p>
<p>const int a=12;
const int *const ptr=&#38;a;</p>
<p>这就意味着ptr不能被重新赋值，因为它是const指针，定义时需初始化；同时不能通过ptr修改a，因为a也是const变量。</p>
<p>4.有趣的typedef</p>
<p>typedef string *pstring;
const pstring cstr;</p>
<p>这时，cstr是一个指向string类型的const指针，而不是一个指向const string的普通指针。因为const pstring cstr;,const修饰的是pstring这个类型，而这个类型是一个string指针。其实：</p>
<p>string s;
typedef string *pstring;
/*以下三个定义相同，都是指向string的const指针*/
const pstring cstr1=&#38;a;
pstring const cstr2=&#38;a;
string *const cstr3=&#38;a;</p>
<p>5.记忆方法
记忆方法其实很简单，只需看清const和*的位置就可以，const在前，则是指向const变量的指针，如：</p>
<p>const int *ptr;int const *ptr;</p>
<p>*在前，则是const指针，如：</p>
<p>int *const ptr;</p>
<p>两个const，则是指向const的const指针了，如：</p>
<p>const int *const ptr;</p>


<p>关联文章:strftime和strptime使用
C <p><a href="http://www.vi1129.com/2010/01/const-ptr/">继续阅读</a></p>


关联文章:<ol><li><a href='http://www.vi1129.com/2009/07/strftime-and-strptime-usage/' rel='bookmark' title='Permanent Link: strftime和strptime使用'>strftime和strptime使用</a></li>
<li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
<li><a href='http://www.vi1129.com/2009/11/linux-md5/' rel='bookmark' title='Permanent Link: MD5应用的一点理解及Linux实现源码'>MD5应用的一点理解及Linux实现源码</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>const限定符指定了一个变量为只读变量，是不允许被改变的，因此const变量在定义时就必须初始化。<br />
const在与指针搭配时，使用将变的复杂和微妙。简单的说const搭配指针就会出现以下三种情况：</p>
<ul>
<li>指向const变量(对象)的指针</li>
<li>const指针</li>
<li>指向const变量(对象)的const指针</li>
</ul>
<p><strong>1.指向const变量(对象)的指针</strong><br />
指针指向了const变量，例如 const int *ptr或者int const *ptr，这两种写法含义一样，这表示const限定了ptr所指向的数据类型，而并非ptr本身。即ptr本身并不是const.可以对ptr重新赋值，无需在定义时初始化。<br />
指向const变量的指针可以指向一个const变量，也可以指向一个非const变量，当然指针类型与变量类型要一致。不管指向了一个const变量还是非const变量，任何企图通过这个指针去修改变量的值都会导致编译错误。同时，const变量只能赋给指向const变量的指针，赋给一个普通变量也是不允许的。<span id="more-601"></span><br />
如（代码仅供理解const,不要刻意追求是否正确可执行）：</p>
<blockquote><p>const int *ptr;<br />
int *ptr_1;<br />
const int a=12;<br />
const int b=13;<br />
int c=14;<br />
ptr=&amp;a;/*指向const变量*/<br />
ptr=&amp;b;/*重新赋值指向const变量*/<br />
*ptr=20;/*error,不能通过ptr修改*/<br />
ptr=&amp;c;/*重新赋值指向非const变量*/<br />
ptr_1=&amp;c;/*普通指针指向普通变量*/<br />
ptr_1=&amp;a;/*error，普通指针不能指向const变量*/</p></blockquote>
<p>《C++ Primer》中对此有详细的解释，尽管不能通过指向const对象的指针去修改基础对象，然而如果该指针指向的是一个非const对象，可以用其他方法修改所指的对象。如下的例子：</p>
<blockquote><p>const int *ptr;<br />
int *ptr_1;<br />
int c=14;<br />
ptr=&amp;c;<br />
printf(&#8221;c=%d\n&#8221;,*ptr);<br />
ptr_1=&amp;c;<br />
*ptr_1=18/*通过非指向const的指针修改*/<br />
printf(&#8221;c=%d\n&#8221;,*ptr);</p></blockquote>
<p>输出结果可以看到两次输出是不一样的。对此，《C++ Primer》中说，如果把指向const的指针理解为“自以为指向const的指针”，这可能会对理解有所帮助。</p>
<p><strong>2.const指针</strong></p>
<blockquote><p>int a=12;<br />
int *const ptr=&amp;a</p></blockquote>
<p>这意味着ptr这个指针被定义成const变量，必须在定义时初始化，并不能重新对ptr赋值，即不能将ptr再指向其他变量。但是，*ptr=13，这样的操作完全取决与a是不是一个const变量，在这个例子中不是，所以*ptr=13是正确的，假如a这样定义，const int a=12,*ptr=13会导致错误。</p>
<p><strong>3.指向const变量(对象)的const指针</strong></p>
<blockquote><p>const int a=12;<br />
const int *const ptr=&amp;a;</p></blockquote>
<p>这就意味着ptr不能被重新赋值，因为它是const指针，定义时需初始化；同时不能通过ptr修改a，因为a也是const变量。</p>
<p><strong>4.有趣的typedef</strong></p>
<blockquote><p>typedef string *pstring;<br />
const pstring cstr;</p></blockquote>
<p>这时，cstr是一个指向string类型的const指针，而不是一个指向const string的普通指针。因为const pstring cstr;,const修饰的是pstring这个类型，而这个类型是一个string指针。其实：</p>
<blockquote><p>string s;<br />
typedef string *pstring;<br />
/*以下三个定义相同，都是指向string的const指针*/<br />
const pstring cstr1=&amp;a;<br />
pstring const cstr2=&amp;a;<br />
string *const cstr3=&amp;a;</p></blockquote>
<p><strong>5.记忆方法</strong><br />
记忆方法其实很简单，只需看清const和*的位置就可以，const在前，则是指向const变量的指针，如：</p>
<blockquote><p>const int *ptr;int const *ptr;</p></blockquote>
<p>*在前，则是const指针，如：</p>
<blockquote><p>int *const ptr;</p></blockquote>
<p>两个const，则是指向const的const指针了，如：</p>
<blockquote><p>const int *const ptr;</p></blockquote>


<p>关联文章:<ol><li><a href='http://www.vi1129.com/2009/07/strftime-and-strptime-usage/' rel='bookmark' title='Permanent Link: strftime和strptime使用'>strftime和strptime使用</a></li>
<li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
<li><a href='http://www.vi1129.com/2009/11/linux-md5/' rel='bookmark' title='Permanent Link: MD5应用的一点理解及Linux实现源码'>MD5应用的一点理解及Linux实现源码</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2010/01/const-ptr/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Linux多线程(1)</title>
		<link>http://www.vi1129.com/2010/01/mutithread-1/</link>
		<comments>http://www.vi1129.com/2010/01/mutithread-1/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 07:41:45 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[多线程]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=588</guid>
		<description><![CDATA[<p>学习参考《linux高级程序设计卷一》</p>
<p>GNU/Linux 实现了 POSIX 标准线程 API。所有线程函数和数据类型都在&#60;pthread.h&#62;头文件中声明。这些线程相关的函数没有被包含在 C 标准库中，而是在libpthread 中，所以当链接程序的时候需在命令行中加入 -lpthread 以确保能正确链接。</p>
<p>1.创建线程</p>
<p>创建线程使用pthread_create函数，函数原型：</p>
<p>int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg)</p>
<p>参数解释:
a.一个指向pthread_t 类型变量的指针，新线程的线程 ID 将存储在这里。
b.一个指向线程属性（thread attribute）对象的指针，这个对象控制着新线程与程序其它部分交互的具体细节。如果传递NULL 作为线程属性，新线程将被赋予一组默认线程属性。
c.一个指向线程函数的指针。这是一个普通的函数指针，类型如下：void* (*) (void*)。
d.一个线程参数，类型void*，不论你传递什么值作为这个参数，当线程开始执行的时候，它都会被直接传递给新的线程。</p>
<p>函数 pthread_create 会在调用后立刻返回，原线程会继续执行之后的指令。同时，新线程开始执行线程函数。Linux 异步调度这两个线程，因此你的程序不能依赖两个线程得到执行的特定先后顺序。</p>
<p>1.1线程参数传递</p>
<p>pthread_create的第四个参数为第三个参数（线程将要执行的函数）的参数，通常的做法是给线程函数定义一个结构以包含线程函数所期待的实际参数序列，给线程函数定义一个结构以包含线程函数所期待的实际参数序列。</p>
<p>1.2等待线程</p>
<p>因为线程共享了主线程的数据，尤其是当给线程传递了参数时，主线程必须等待线程执行完成后才可以退出，严格的说主线程必须在线程执行完成之前确保参数的完整，因为通常这些参数是在主线程中定义的。这类似于局部变量（当生命期结束的时候自动释放）和堆上分配的对象（通过free或者C++的delete手工释放）。务必确保这个变量不会被释放（甚至在其它线程中也不行！），直到你确定这个线程不会再使用它。
使用pthread_join(pthread_t thread,void **retval)，强制主线程等待线程退出。</p>
<p>一个例子&#8211;主线程创建两个线程，一个输出x，另一个输出o。</p>

?View Code C1
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
#include &#60;stdio.h&#62; 
#include &#60;pthread.h&#62;
&#160;
/* print_function 的参数 */
struct char_print_parms
&#123;
/* 用于输出的字符 */
char character;
/* 输出的次数 */
int count;
&#125;;
/* 按照 PARAMETERS 提供的数据，输出一定数量的字符到stderr。
PARAMETERS 是一个指向 struct char_print_parms 的指针 */
void* char_print &#40;void* parameters&#41;
&#123;
/* <p><a href="http://www.vi1129.com/2010/01/mutithread-1/">继续阅读</a></p>


关联文章:<ol><li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
<li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2009/11/linux-md5/' rel='bookmark' title='Permanent Link: MD5应用的一点理解及Linux实现源码'>MD5应用的一点理解及Linux实现源码</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><em>学习参考《linux高级程序设计卷一》</em></p>
<p>GNU/Linux 实现了 POSIX 标准线程 API。所有线程函数和数据类型都在&lt;pthread.h&gt;头文件中声明。这些线程相关的函数没有被包含在 C 标准库中，而是在libpthread 中，所以当链接程序的时候需在命令行中加入 -lpthread 以确保能正确链接。</p>
<p><span style="color: #008080;"><strong>1.创建线程</strong></span></p>
<p>创建线程使用pthread_create函数，函数原型：</p>
<blockquote><p>int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg)</p></blockquote>
<p>参数解释:<br />
a.一个指向pthread_t 类型变量的指针，新线程的线程 ID 将存储在这里。<br />
b.一个指向线程属性（thread attribute）对象的指针，这个对象控制着新线程与程序其它部分交互的具体细节。如果传递NULL 作为线程属性，新线程将被赋予一组默认线程属性。<br />
c.一个指向线程函数的指针。这是一个普通的函数指针，类型如下：void* (*) (void*)。<br />
d.一个线程参数，类型void*，不论你传递什么值作为这个参数，当线程开始执行的时候，它都会被直接传递给新的线程。</p>
<p>函数 pthread_create 会在调用后立刻返回，原线程会继续执行之后的指令。同时，新线程开始执行线程函数。Linux 异步调度这两个线程，因此你的程序不能依赖两个线程得到执行的特定先后顺序。</p>
<p><span style="color: #008080;">1.1线程参数传递</span></p>
<p>pthread_create的第四个参数为第三个参数（线程将要执行的函数）的参数，通常的做法是给线程函数定义一个结构以包含线程函数所期待的实际参数序列，给线程函数定义一个结构以包含线程函数所期待的实际参数序列。</p>
<p><span style="color: #008080;">1.2等待线程</span></p>
<p>因为线程共享了主线程的数据，尤其是当给线程传递了参数时，主线程必须等待线程执行完成后才可以退出，严格的说主线程必须在线程执行完成之前确保参数的完整，因为通常这些参数是在主线程中定义的。这类似于局部变量（当生命期结束的时候自动释放）和堆上分配的对象（通过free或者C++的delete手工释放）。务必确保这个变量不会被释放（甚至在其它线程中也不行！），直到你确定这个线程不会再使用它。<br />
使用pthread_join(pthread_t thread,void **retval)，强制主线程等待线程退出。</p>
<p>一个例子&#8211;主线程创建两个线程，一个输出x，另一个输出o。</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p588code28'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p58828"><td class="line_numbers"><pre>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
</pre></td><td class="code" id="p588code28"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt; </span>
<span style="color: #339933;">#include &lt;pthread.h&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* print_function 的参数 */</span>
<span style="color: #993333;">struct</span> char_print_parms
<span style="color: #009900;">&#123;</span>
<span style="color: #808080; font-style: italic;">/* 用于输出的字符 */</span>
<span style="color: #993333;">char</span> character<span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/* 输出的次数 */</span>
<span style="color: #993333;">int</span> count<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/* 按照 PARAMETERS 提供的数据，输出一定数量的字符到stderr。
PARAMETERS 是一个指向 struct char_print_parms 的指针 */</span>
<span style="color: #993333;">void</span><span style="color: #339933;">*</span> char_print <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span> parameters<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #808080; font-style: italic;">/* 将参数指针转换为正确的类型 */</span>
<span style="color: #993333;">struct</span> char_print_parms<span style="color: #339933;">*</span> p <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> char_print_parms<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> parameters<span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> p<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>count<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
fputc <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>character<span style="color: #339933;">,</span> stderr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #808080; font-style: italic;">/* 主程序 */</span>
&nbsp;
<span style="color: #993333;">int</span> main <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
pthread_t thread1_id<span style="color: #339933;">;</span>
pthread_t thread2_id<span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> char_print_parms thread1_args<span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> char_print_parms thread2_args<span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/* 创建一个输出 30000 个 x 的线程 */</span>
hread1_args.<span style="color: #202020;">character</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'x'</span><span style="color: #339933;">;</span>
thread1_args.<span style="color: #202020;">count</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">30000</span><span style="color: #339933;">;</span>
prhread_create <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>thread1_id<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>char_print<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>thread1_args<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* 创建一个输出 20000 个 o 的线程 */</span>
thread2_args.<span style="color: #202020;">character</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'o'</span><span style="color: #339933;">;</span>
thread2_args.<span style="color: #202020;">count</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">20000</span><span style="color: #339933;">;</span>
pthread_create <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>thread2_id<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>char_print<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>thread2_args<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/* 确保第一个线程结束 */</span>
pthread_join <span style="color: #009900;">&#40;</span>thread1_id<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/* 确保第二个线程结束 */</span>
pthread_join <span style="color: #009900;">&#40;</span>thread2_id<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/* 现在我们可以安全地返回 */</span>
<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><span style="color: #008080;">1.3 线程取消</span></p>
<p>在一个线程中以另一个线程ID作为参数调用pthread_cancel可以取消另一个线程。但是，线程可能运行在一段不可分割的代码中，必须全部得到执行或者干脆不执行。例如，线程可能分配一些资源，使用并稍后释放它们。如果线程在中途被取消，它可能没有机会释放那些被分配的资源，从而导致资源的泄漏。为防止这种情况发生，一个线程可以控制自身是否可以被取消，以及何时允许取消操作。</p>
<p>线程可以调用pthread_setcancelstate和pthread_setcanceltype来决定自身是否允许被其他线程取消，及取消方式（PTHREAD_CANCEL_DEFERRED和PTHREAD_CANCEL_ASYNCHRONOUS）。</p>


<p>关联文章:<ol><li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
<li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2009/11/linux-md5/' rel='bookmark' title='Permanent Link: MD5应用的一点理解及Linux实现源码'>MD5应用的一点理解及Linux实现源码</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2010/01/mutithread-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>细心的写代码很重要</title>
		<link>http://www.vi1129.com/2009/12/be-carefuf-coding/</link>
		<comments>http://www.vi1129.com/2009/12/be-carefuf-coding/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 03:27:52 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[内存]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=573</guid>
		<description><![CDATA[<p>一个很简单的说法早都知道，那就是内存泄漏，或者说访问了未申请的内存空间会产生不可预料的错误。
之前就遇到一个问题，在我机器上编译的二进制程序运行出错，除了在我的机器以外，在同事的机器上运行一样出错。意外的是同事拿走我的源码在他机器上编译后的二进制程序，除了在他自己的机器上运行正常，在我机器上运行同样不会出错。
最后是找啊找，找啊找。发现了一个用来存储一条SQL语句的char型数组被声明成了128字节长，事实上这条SQL语句在某些情况下会超出128字节，这样的错误找起来真是累人，改大了一点后，一切正常了。
不幸的是就在上周，又遇到了类似的错误，还是费了半天劲，发现是一个两位数的负数被放到了一个char型的数组中，而这个数组只有2字节长，天那，如果吸取了上次的教训，就不用花好几个小时来找这样让人头疼的错误了。话说回来，在一个char型数组中放置一个数字，还是个负数，用起来还要进行转换，岂不是很麻烦。 哦，忘了，是因为要用char型而从int转换过去的。无语。
为什么不可预料的错误在某个机器上100%出错，而在另一个机器上100%没错（虽然我没尝试100次），也行这只能用不可预料来解释了。</p>
<p>细心一点吧，这样的问题应该在写的时候就应该避免，编译器不会帮我们这个忙。</p>


<p>No related posts.</p>


No related posts.]]></description>
			<content:encoded><![CDATA[<p>一个很简单的说法早都知道，那就是内存泄漏，或者说访问了未申请的内存空间会产生不可预料的错误。<br />
之前就遇到一个问题，在我机器上编译的二进制程序运行出错，除了在我的机器以外，在同事的机器上运行一样出错。意外的是同事拿走我的源码在他机器上编译后的二进制程序，除了在他自己的机器上运行正常，在我机器上运行同样不会出错。<br />
最后是找啊找，找啊找。发现了一个用来存储一条SQL语句的char型数组被声明成了128字节长，事实上这条SQL语句在某些情况下会超出128字节，这样的错误找起来真是累人，改大了一点后，一切正常了。<br />
不幸的是就在上周，又遇到了类似的错误，还是费了半天劲，发现是一个两位数的负数被放到了一个char型的数组中，而这个数组只有2字节长，天那，如果吸取了上次的教训，就不用花好几个小时来找这样让人头疼的错误了。话说回来，在一个char型数组中放置一个数字，还是个负数，用起来还要进行转换，岂不是很麻烦。 哦，忘了，是因为要用char型而从int转换过去的。无语。<br />
为什么不可预料的错误在某个机器上100%出错，而在另一个机器上100%没错（虽然我没尝试100次），也行这只能用不可预料来解释了。</p>
<p>细心一点吧，这样的问题应该在写的时候就应该避免，编译器不会帮我们这个忙。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2009/12/be-carefuf-coding/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>利用sudo为PHP批特权</title>
		<link>http://www.vi1129.com/2009/12/sudo/</link>
		<comments>http://www.vi1129.com/2009/12/sudo/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 10:44:45 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[sudo]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=571</guid>
		<description><![CDATA[<p>有时候需要在web上执行一些特殊的终端命令。例如ps，为了在web上显示出当前的进程列表，因为我经常做一些系统方面的编程，所以有时候就不得不做这些高危险性的事情。用下边的方法就可以允许php用exec，system等函数来执行这些终端命令。
  键入命令visudo,打开sudoers文件，编辑该文件
  注释掉Defaults requiretty一行，并在文件末尾追加Apache ALL=NOPASSWD:/bin/ps
这样，在php中就可以用类似这样的语句去执行ps命令exec(&#8221;/usr/bin/sudo   /bin/ps -e&#8221;); ，当然，ps的参数可以随意指定，和在终端下使用一样。需要注意的是这里使用的是apache服务器，不同的web服务器该方法应该不能混用。
不允许php来执行的命令有很多，比如chkconfig,想开启或关闭一个服务，这些只有root才能做的事情，普通用户都是没有权限的，跟何况要php去做。所以同样的会带来安全问题，总之慎用就好。</p>
<p>记之，与大家分享，以备后用。</p>


<p>No related posts.</p>


No related posts.]]></description>
			<content:encoded><![CDATA[<p>有时候需要在web上执行一些特殊的终端命令。例如ps，为了在web上显示出当前的进程列表，因为我经常做一些系统方面的编程，所以有时候就不得不做这些高危险性的事情。用下边的方法就可以允许php用exec，system等函数来执行这些终端命令。<br />
  键入命令visudo,打开sudoers文件，编辑该文件<br />
  注释掉Defaults requiretty一行，并在文件末尾追加Apache ALL=NOPASSWD:/bin/ps<br />
这样，在php中就可以用类似这样的语句去执行ps命令exec(&#8221;/usr/bin/sudo   /bin/ps -e&#8221;); ，当然，ps的参数可以随意指定，和在终端下使用一样。需要注意的是这里使用的是apache服务器，不同的web服务器该方法应该不能混用。<br />
不允许php来执行的命令有很多，比如chkconfig,想开启或关闭一个服务，这些只有root才能做的事情，普通用户都是没有权限的，跟何况要php去做。所以同样的会带来安全问题，总之慎用就好。</p>
<p>记之，与大家分享，以备后用。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2009/12/sudo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>带有#和##符号的函数式宏展开步骤</title>
		<link>http://www.vi1129.com/2009/12/macro-expand/</link>
		<comments>http://www.vi1129.com/2009/12/macro-expand/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 04:47:59 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[随心所记]]></category>
		<category><![CDATA[宏]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=549</guid>
		<description><![CDATA[<p>在函数式宏定义中，#运算符用于创建字符串，#运算符后面应该跟一个形参（中间可以有空格或Tab），s将被作为一个字符串替换，并且s中的多个空格或tab将被替换为一个空格。
#define STR(s) # s
STR(hello    	world)
预处理后变为&#8221;hello world&#8221; 。
##运算符把前后两个预处理Token连接成一个预处理Token，和#运算符不同，##运算符不仅限于函数式宏定义，变量式宏定义也可以用。
先列出一个例子，当然这不是一段可执行的程序，甚至编译不了，只是为了说明宏展开的步骤问题，事实上这样的宏定义很多地方都能见到。</p>
<p>
#define _sh(x)    p_f(&#8221;n&#8221;,#x,&#8221;=%d, or %d\n&#8221;,n##x,alt[x])
#define sh(x)    _sh(x)
#define NA    26
_sh(NA)
sh(NA)</p>
<p>可能发现第二行的定义有些多余，但结果却是截然不同的。
使用cpp命令做一下预处理就可以看到_sh(NA)和sh(NA)展开的不同，以下为展开结果。</p>
<p>
p_f(&#8221;n&#8221;,&#8221;NA&#8221;,&#8221;=%d, or %d\n&#8221;,nNA,alt[26])
p_f(&#8221;n&#8221;,&#8221;26&#8243;,&#8221;=%d, or %d\n&#8221;,n26,alt[26])
</p>
<p>下边分别说一下_sh(NA)和sh(NA)的展开步骤</p>
<p>_sh(NA)展开的步骤如下：
1.#x要替换成&#8221;NA&#8221;。
2.n##x要替换成nNA。
3.除了带#和##运算符的参数之外，其它参数在替换之前要对实参本身做充分的展开，所以应该先把NA展开成26再替换到alt[x]中x的位置。换言之，带有#和##的不会再进行二次替换。
4.现在展开成了p_f(&#8221;n&#8221; &#8220;NA&#8221; &#8220;=%d, or %d\n&#8221;,nNA,alt[26])，所有参数都替换完了，这时编译器会再扫描一遍，再找出可以展开的宏定义来展开，假设NA或alt是变量式宏定义，这时会进一步展开,但经#或##替换的除外，所以&#8221;NA&#8221;并没有成为”26“，nNA也没有被替换为n26。</p>
<p>sh(NA)展开的步骤如下：
1.用_sh(NA)替换sh(NA),并扫描，发现NA可以再展开，展开为_sh(26)
2. 展开_sh(26)为p_f(&#8221;n&#8221;,&#8221;26&#8243;,&#8221;=%d, or %d\n&#8221;,n26,alt[26])</p>
<p>所以，当期望宏替换为变量式宏的值而不是这个宏名，并且有#或者##在使用时，就要格外注意了，需要再加一条看似废话的宏定义。</p>
<p>另外，关于带有可变参数的函数在宏定义时，除了可以使用__VA_ARGS__来替代可变参数外，也可以使用##来连接。如下的两个宏定义是类似的</p>
<p>#define vprint(fmt, &#8230;)     log_z(__FILE__,__LINE__,fmt,__VA_ARGS__)
#define vprint(fmt,args&#8230;)    log_z(__FILE__,__LINE__,fmt,## args)</p>
<p>这个宏常用在日志函数中，调用vprint函数就加入了文件名和行号，方便debug,也可以加入__DATE__,__TIME__等等预定义变量，log_z函数实现如下</p>
<p>void log_z(char *fn,int ln,const char <p><a href="http://www.vi1129.com/2009/12/macro-expand/">继续阅读</a></p>


关联文章:<ol><li><a href='http://www.vi1129.com/2009/06/add-line-number-in-code/' rel='bookmark' title='Permanent Link: 为你的程序增加一个带文件名和行号的打印函数'>为你的程序增加一个带文件名和行号的打印函数</a></li>
<li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>在函数式宏定义中，#运算符用于创建字符串，#运算符后面应该跟一个形参（中间可以有空格或Tab），s将被作为一个字符串替换，并且s中的多个空格或tab将被替换为一个空格。<br />
#define STR(s) # s<br />
STR(hello    	world)<br />
预处理后变为&#8221;hello world&#8221; 。<br />
##运算符把前后两个预处理Token连接成一个预处理Token，和#运算符不同，##运算符不仅限于函数式宏定义，变量式宏定义也可以用。<br />
先列出一个例子，当然这不是一段可执行的程序，甚至编译不了，只是为了说明宏展开的步骤问题，事实上这样的宏定义很多地方都能见到。</p>
<blockquote><p>
#define _sh(x)    p_f(&#8221;n&#8221;,#x,&#8221;=%d, or %d\n&#8221;,n##x,alt[x])<br />
#define sh(x)    _sh(x)<br />
#define NA    26<br />
_sh(NA)<br />
sh(NA)</p></blockquote>
<p>可能发现第二行的定义有些多余，但结果却是截然不同的。<br />
使用cpp命令做一下预处理就可以看到_sh(NA)和sh(NA)展开的不同，以下为展开结果。</p>
<blockquote><p>
p_f(&#8221;n&#8221;,&#8221;NA&#8221;,&#8221;=%d, or %d\n&#8221;,nNA,alt[26])<br />
p_f(&#8221;n&#8221;,&#8221;26&#8243;,&#8221;=%d, or %d\n&#8221;,n26,alt[26])
</p></blockquote>
<p>下边分别说一下_sh(NA)和sh(NA)的展开步骤</p>
<p>_sh(NA)展开的步骤如下：<br />
1.#x要替换成&#8221;NA&#8221;。<br />
2.n##x要替换成nNA。<br />
3.除了带#和##运算符的参数之外，其它参数在替换之前要对实参本身做充分的展开，所以应该先把NA展开成26再替换到alt[x]中x的位置。换言之，带有#和##的不会再进行二次替换。<br />
4.现在展开成了p_f(&#8221;n&#8221; &#8220;NA&#8221; &#8220;=%d, or %d\n&#8221;,nNA,alt[26])，所有参数都替换完了，这时编译器会再扫描一遍，再找出可以展开的宏定义来展开，假设NA或alt是变量式宏定义，这时会进一步展开,但经#或##替换的除外，所以&#8221;NA&#8221;并没有成为”26“，nNA也没有被替换为n26。</p>
<p>sh(NA)展开的步骤如下：<br />
1.用_sh(NA)替换sh(NA),并扫描，发现NA可以再展开，展开为_sh(26)<br />
2. 展开_sh(26)为p_f(&#8221;n&#8221;,&#8221;26&#8243;,&#8221;=%d, or %d\n&#8221;,n26,alt[26])</p>
<p>所以，当期望宏替换为变量式宏的值而不是这个宏名，并且有#或者##在使用时，就要格外注意了，需要再加一条看似废话的宏定义。</p>
<p>另外，关于带有可变参数的函数在宏定义时，除了可以使用__VA_ARGS__来替代可变参数外，也可以使用##来连接。如下的两个宏定义是类似的</p>
<blockquote><p>#define vprint(fmt, &#8230;)     log_z(__FILE__,__LINE__,fmt,__VA_ARGS__)<br />
#define vprint(fmt,args&#8230;)    log_z(__FILE__,__LINE__,fmt,## args)</p></blockquote>
<p>这个宏常用在日志函数中，调用vprint函数就加入了文件名和行号，方便debug,也可以加入__DATE__,__TIME__等等预定义变量，log_z函数实现如下</p>
<blockquote><p>void log_z(char *fn,int ln,const char *fmt, &#8230;)<br />
{<br />
    va_list ap;<br />
    char buf[4096];<br />
    va_start(ap,fmt);<br />
    vsnprintf(buf,4096,fmt,ap);<br />
    printf(&#8221;[%s %d]&#8220;,fn,ln);<br />
    printf(buf);<br />
    printf(&#8221;\n&#8221;);<br />
}</p></blockquote>
<p>另一个更加简单有效的增加行号的做法是这样定义的</p>
<blockquote><p>#define vprint(fmt,args&#8230;) printf(&#8221;[%s %d]&#8220;fmt,__FILE__,__LINE__,##args)</p></blockquote>


<p>关联文章:<ol><li><a href='http://www.vi1129.com/2009/06/add-line-number-in-code/' rel='bookmark' title='Permanent Link: 为你的程序增加一个带文件名和行号的打印函数'>为你的程序增加一个带文件名和行号的打印函数</a></li>
<li><a href='http://www.vi1129.com/2010/03/sock_raw-dump/' rel='bookmark' title='Permanent Link: 使用原始套接字SOCK_RAW捕捉网络数据包并简单分析'>使用原始套接字SOCK_RAW捕捉网络数据包并简单分析</a></li>
<li><a href='http://www.vi1129.com/2010/04/c-hash-table-code/' rel='bookmark' title='Permanent Link: C hash table code'>C hash table code</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2009/12/macro-expand/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
