<?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; C</title>
	<atom:link href="http://www.vi1129.com/tag/c/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>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="p6805"><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="p680code5"><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="p6806"><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="p680code6"><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="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
</pre></td><td class="code" id="p680code7"><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="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
</pre></td><td class="code" id="p680code8"><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="p66312"><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="p663code12"><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="p66313"><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="p663code13"><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="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
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="p663code14"><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="p63916"><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="p639code16"><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('p617code21'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p61721"><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="p617code21"><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('p617code22'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p61722"><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="p617code22"><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('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
</pre></td><td class="code" id="p617code23"><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('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
</pre></td><td class="code" id="p617code24"><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('p588code26'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p58826"><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="p588code26"><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/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>
		<item>
		<title>静态库/动态库的编译和使用方法学习记录</title>
		<link>http://www.vi1129.com/2009/12/make-lib/</link>
		<comments>http://www.vi1129.com/2009/12/make-lib/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 08:49:32 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[动态库]]></category>
		<category><![CDATA[静态库]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=437</guid>
		<description><![CDATA[<p>本文参考资料：《Linux编程一站式学习》 版权 © 2008, 2009 宋劲杉, 北京亚嵌教育研究中心
部分内容摘自此文</p>
<p>有时候需要把一组代码编译成一个库，这个库在很多项目中都要用到，例如libc就是这样一个库，我们在不同的程序中都会用到libc中的库函数（例如printf），也会用到libc中的变量。
学习中用到的一个简单的小程序，程序将字符a,b,c压入堆栈stack[512],随后再倒序输出，打印出cba。为了使用到的gcc命令更具有意义，特意将程序分开在了几个C文件中，最后将几个.o文件链接为可执行文件。
stack.c</p>

?View Code Cchar stack&#91;512&#93;;
int top = -1;

<p>pop.c</p>

?View Code Cextern int top;
extern char stack&#91;512&#93;;
char pop&#40;void&#41;
&#123;
return stack&#91;top--&#93;;
&#125;

<p>push.c</p>

?View Code Cextern int top;
extern char stack&#91;512&#93;;
void push&#40;char c&#41;
&#123;
stack&#91;++top&#93;=c;
&#125;

<p>
empty.c</p>

?View Code Cextern int top;
int is_empty&#40;void&#41;
&#123;
return top == -1;
&#125;

<p>stack.h</p>

?View Code C#ifdef STACK_H
#define STACK_H
extern void push&#40;char&#41;;
extern char pop&#40;void&#41;;
extern int is_empty&#40;void&#41;;
#endif

<p>main.c</p>

?View Code C#include&#60;stdio.h&#62;
#include &#34;stack.h&#34;
int main&#40;void&#41;
&#123;
push&#40;'a'&#41;;
push&#40;'b'&#41;;
push&#40;'c'&#41;;
while&#40;!is_empty&#40;&#41;&#41;
putchar&#40;pop&#40;&#41;&#41;;
putchar&#40;'\n'&#41;;
return 0;
&#125;

<p>整个程序放在/root/ctest/stack下，文件结构如下:</p>
<p>[root@localhost stack]pwd
/root/ctest/stack
[root@localhost stack]tree
.
&#124;&#8211; main.c
`&#8211; <p><a href="http://www.vi1129.com/2009/12/make-lib/">继续阅读</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/2009/06/add-line-number-in-code/' rel='bookmark' title='Permanent Link: 为你的程序增加一个带文件名和行号的打印函数'>为你的程序增加一个带文件名和行号的打印函数</a></li>
<li><a href='http://www.vi1129.com/2009/11/recursion/' rel='bookmark' title='Permanent Link: 递归程序的困扰'>递归程序的困扰</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><em>本文参考资料：《Linux编程一站式学习》 版权 © 2008, 2009 宋劲杉, 北京亚嵌教育研究中心<br />
部分内容摘自此文</em></p>
<p>有时候需要把一组代码编译成一个库，这个库在很多项目中都要用到，例如libc就是这样一个库，我们在不同的程序中都会用到libc中的库函数（例如printf），也会用到libc中的变量。<br />
学习中用到的一个简单的小程序，程序将字符a,b,c压入堆栈stack[512],随后再倒序输出，打印出cba。为了使用到的gcc命令更具有意义，特意将程序分开在了几个C文件中，最后将几个.o文件链接为可执行文件。<br />
stack.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('p437code33'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43733"><td class="code" id="p437code33"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> stack<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">512</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> top <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>pop.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('p437code34'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43734"><td class="code" id="p437code34"><pre class="c" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">int</span> top<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">char</span> stack<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">512</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> pop<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> stack<span style="color: #009900;">&#91;</span>top<span style="color: #339933;">--</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>push.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('p437code35'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43735"><td class="code" id="p437code35"><pre class="c" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">int</span> top<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">char</span> stack<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">512</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> push<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> c<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
stack<span style="color: #009900;">&#91;</span><span style="color: #339933;">++</span>top<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>c<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><span id="more-437"></span><br />
empty.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('p437code36'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43736"><td class="code" id="p437code36"><pre class="c" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">int</span> top<span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> is_empty<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> top <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>stack.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('p437code37'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43737"><td class="code" id="p437code37"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifdef STACK_H</span>
<span style="color: #339933;">#define STACK_H</span>
<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">void</span> push<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">char</span> pop<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">int</span> is_empty<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">#endif</span></pre></td></tr></table></div>

<p>main.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('p437code38'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43738"><td class="code" id="p437code38"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include&lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &quot;stack.h&quot;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
push<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
push<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'b'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
push<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'c'</span><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: #339933;">!</span>is_empty<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
putchar<span style="color: #009900;">&#40;</span>pop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
putchar<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</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: #009900;">&#125;</span></pre></td></tr></table></div>

<p>整个程序放在/root/ctest/stack下，文件结构如下:</p>
<blockquote><p>[root@localhost stack]pwd<br />
/root/ctest/stack<br />
[root@localhost stack]tree<br />
.<br />
|&#8211; main.c<br />
`&#8211; stack<br />
|&#8211; empty.c<br />
|&#8211; pop.c<br />
|&#8211; push.c<br />
|&#8211; stack.c<br />
|&#8211; stack.h</p></blockquote>
<p>我将除了main.c外的其他文件放入stack目录中，并准备将stack目录下的所有东西打包为库文件，也就是将几个函数打包。</p>
<h4>静态库</h4>
<p>进入stack目录编译并生成libstack.a文件，再编译main.c，生成可执行文件main:</p>
<blockquote><p>[root@localhost]pwd<br />
/root/ctest/stack/stack<br />
[root@localhost]gcc -c empty.c pop.c push.c stack.c<br />
[root@localhost]ar rs libstack.a empty.o pop.o push.o stack.o<br />
ar:creating libstack.a<br />
[root@localhost]cd ..<br />
[root@localhost]gcc main.c -Lstack -lstack -Istack -omain<br />
[root@localhost]./main<br />
cba</p></blockquote>
<p>最后的文件结构就变成了:</p>
<blockquote><p>[root@localhost stack]pwd<br />
/root/ctest/stack<br />
[root@localhost stack]tree<br />
.<br />
|&#8211; main<br />
|&#8211; main.c<br />
`&#8211; stack<br />
|&#8211; empty.c<br />
|&#8211; empty.o<br />
|&#8211; libstack.a<br />
|&#8211; pop.c<br />
|&#8211; pop.o<br />
|&#8211; push.c<br />
|&#8211; push.o<br />
|&#8211; stack.c<br />
|&#8211; stack.h<br />
|&#8211; stack.o</p></blockquote>
<p>库文件名都是以lib开头的，静态库以.a作为后缀，表示Archive。ar命令类似于tar命令，起一个打包的作用，但是把目标文件打包成静态库只能用ar命令而不能用tar命令。选项r表示将后面的文件列表添加到文件包，如果文件包不存在就创建它，如果文件包中已有同名文件就替换成新的。s是专用于生成静态库的，表示为静态库创建索引，这个索引被链接器使用。<br />
gcc的-L参数指定了库文件的路径，-Lstack就是当前目录下的stack目录了，如果库文件在当前目录，用-L.就好；-lstack指定库文件名，正如刚才所说的库文件都是以lib开头，所以这里的参数库名不要加lib，也不要扩展名.a或.so(动态库)，-Istack，如果你仔细看程序了会发现main.c里的#include &#8220;stack.h&#8221;，stack.h在stack目录里，所以-Istack就指定了头文件的位置，当然如果这样写#include &#8220;stack/stack.h&#8221;的话，就不需要-Istack了。<br />
另外，gcc使用-print-search-dirs参数可以查看你的gcc会在哪些目录里去查找库文件，除非你将刚才的libstack.a放在了这些位置，否则-L参数不可少。</p>
<h4>动态库</h4>
<p>动态库的区别与静态库，简单的说程序在运行时才会去查找库文件，而不是像静态库一样在链接时就将整个库连接到了可执行文件中，所以一般来说，使用动态库的可执行文件要比使用静态库的体积小。<br />
删除刚才产生的库文件，目标文件，可执行文件，只留下源码，执行下边的命令重新生成动态库及可执行文件:</p>
<blockquote><p>[root@localhost]pwd<br />
/root/ctest/stack<br />
[root@localhost]cd stack<br />
[root@localhost]gcc -c -fPIC *.c<br />
[root@localhost]gcc -shared -Wl,-soname,libstack.so.1 -o libstack.so.1.0 *.o</p></blockquote>
<p>这样,名为 libstack.so.1.0的动态库已经生成，但是链接是gcc只认识名为libstack.so的库文件，为什么要加版本号呢，还有-Wl参数指定了libstack.so.1，这又是什么?我们在系统的库文件目录里会看到很多的符号链接，这样做有什么意义？稍后解释。</p>
<p>现在需要创建一个符号链接:</p>
<blockquote><p>[root@localhost]ln -s libstack.so.1.0 libstack.so</p></blockquote>
<p>再编译main.c，生成可执行文件:</p>
<blockquote><p>[root@localhost]cd ..<br />
[root@localhost]gcc main.c -Lstack -lstack -Istack -o main</p></blockquote>
<p>如果没有创建符号链接，在编译main.c的时候就会收到 /usr/bin/ld:can not find -lstack错误，链接器找不到stack库文件。<br />
这个时候执行main会发生一个错误error while loading shared libraries: libstack.so: cannot open shared object file: No such file or directory。动态库没有找到。<br />
生成的动态库在/root/ctest/stack/stack目录下，我们在编译链接时指定的库的位置，但是运行时需要这个库文件，系统并不会找到/root/ctest/stack/stack里去。<br />
用ldd命令就可以看到缺少了哪些库：</p>
<blockquote><p>[root@localhost]ldd main<br />
linux-gate.so.1 =&gt;  (0&#215;00a4d000)<br />
libstack.so =&gt; not found<br />
libc.so.6 =&gt; /lib/libc.so.6 (0&#215;00563000)<br />
/lib/ld-linux.so.2 (0&#215;00546000)</p></blockquote>
<p>通过查看ld.so(8)的Man Page可以找到几种解决方法，这里使用其中一种。<br />
修改/etc/ld.so.conf,其中加上库文件的路径/root/ctest/stack/stack/,执行ldconfig生成cache文件/etc/ld.so.cache:</p>
<blockquote><p>[root@localhost]echo /root/ctest/stack/stack &gt;&gt; /etc/ld.so.conf<br />
[root@localhost]ldconfig</p></blockquote>
<p>这时libstack.so.1就产生了，标准的libstack.so其实应该链接到这个文件上来。<br />
此时的main便可以执行:</p>
<blockquote><p>[root@localhost]./main<br />
cba</p></blockquote>
<p>现在的文件结构应该是:</p>
<blockquote><p>[root@localhost stack]pwd<br />
/root/ctest/stack<br />
[root@localhost stack]tree<br />
.<br />
|&#8211; main<br />
|&#8211; main.c<br />
`&#8211; stack<br />
|&#8211; empty.c<br />
|&#8211; empty.o<br />
|&#8211; libstack.so -&gt; libstack.so.1.0<br />
|&#8211; libstack.so.1 -&gt; libstack.so.1.0<br />
|&#8211; libstack.so.1.0<br />
|&#8211; pop.c<br />
|&#8211; pop.o<br />
|&#8211; push.c<br />
|&#8211; push.o<br />
|&#8211; stack.c<br />
|&#8211; stack.h<br />
|&#8211; stack.o</p></blockquote>
<p>可以将libstack.so删除，重新创建为指向libstack.so.1的链接，这是标准的做法。</p>
<h4>[参考资料]共享库的命名惯例</h4>
<p>按照共享库的命名惯例，每个共享库有三个文件名：real name、soname和linker name。真正的库文件（而不是符号链接）的名字是real name，包含完整的共享库版本号。例如上面的libcap.so.1.10、libc-2.8.90.so等。</p>
<p>soname是一个符号链接的名字，只包含共享库的主版本号，主版本号一致即可保证库函数的接口一致，因此应用程序的.dynamic段只记录共享库的soname，只要soname一致，这个共享库就可以用。例如上面的libcap.so.1和libcap.so.2是两个主版本号不同的libcap，有些应用程序依赖于libcap.so.1，有些应用程序依赖于libcap.so.2，但对于依赖libcap.so.1的应用程序来说，真正的库文件不管是libcap.so.1.10还是libcap.so.1.11都可以用，所以使用共享库可以很方便地升级库文件而不需要重新编译应用程序，这是静态库所没有的优点。注意libc的版本编号有一点特殊，libc-2.8.90.so的主版本号是6而不是2或2.8。</p>
<p>linker name仅在编译链接时使用，gcc的-L选项应该指定linker name所在的目录。有的linker name是库文件的一个符号链接，有的linker name是一段链接脚本。例如上面的libc.so就是一个linker name，它是一段链接脚本.</p>
<blockquote><p>$ cat /usr/lib/libc.so<br />
/* GNU ld script<br />
Use the shared library, but some functions are only in<br />
the static library, so try that secondarily.  */<br />
OUTPUT_FORMAT(elf32-i386)<br />
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.2 ) )</p></blockquote>
<p>重新编译我们的libstack，指定它的soname：</p>
<blockquote><p>$ gcc -shared -Wl,-soname,libstack.so.1 -o libstack.so.1.0 stack.o push.o pop.o is_empty.o</p></blockquote>
<p>这样编译生成的库文件是libstack.so.1.0，是real name，但这个库文件中记录了它的soname是libstack.so.1：</p>
<blockquote><p>$ readelf -a libstack.so.1.0<br />
&#8230;&#8230;<br />
Dynamic section at offset 0xf10 contains 22 entries:<br />
Tag        Type                         Name/Value<br />
0&#215;00000001 (NEEDED)                     Shared library: [libc.so.6]<br />
0&#215;0000000e (SONAME)                     Library soname: [libstack.so.1]<br />
&#8230;&#8230;</p></blockquote>
<p>如果把libstack.so.1.0所在的目录加入/etc/ld.so.conf中，然后运行ldconfig命令，ldconfig会自动创建一个soname的符号链接：</p>
<blockquote><p>$ sudo ldconfig<br />
$ ls -l libstack*<br />
lrwxrwxrwx 1 root    root       15 2009-01-21 17:52 libstack.so.1 -&gt; libstack.so.1.0<br />
-rwxr-xr-x 1 djkings djkings 10142 2009-01-21 17:49 libstack.so.1.0但这样编译链接main.c却会报错：</p>
<p>$ gcc main.c -L. -lstack -Istack -o main<br />
/usr/bin/ld: cannot find -lstack</p></blockquote>
<p>collect2: ld returned 1 exit status注意，要做这个实验，你得把先前编译的libstack共享库、静态库都删掉，如果先前拷到/lib或者/usr/lib下了也删掉，只留下libstack.so.1.0和libstack.so.1，这样你会发现编译器不认这两个名字，因为编译器只认linker name。可以先创建一个linker name的符号链接，然后再编译就没问题了：</p>
<blockquote><p>$ ln -s libstack.so.1.0 libstack.so<br />
$ gcc main.c -L. -lstack -Istack -o main</p></blockquote>


<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/2009/06/add-line-number-in-code/' rel='bookmark' title='Permanent Link: 为你的程序增加一个带文件名和行号的打印函数'>为你的程序增加一个带文件名和行号的打印函数</a></li>
<li><a href='http://www.vi1129.com/2009/11/recursion/' rel='bookmark' title='Permanent Link: 递归程序的困扰'>递归程序的困扰</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2009/12/make-lib/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>递归程序的困扰</title>
		<link>http://www.vi1129.com/2009/11/recursion/</link>
		<comments>http://www.vi1129.com/2009/11/recursion/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 05:58:02 +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=420</guid>
		<description><![CDATA[<p>很久没有写过递归程序，今天被一个小小的递归给困扰了。请教了CSDN的大哥们后，终于想明白了。</p>

?View Code C1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include &#60;stdio.c&#62;
#define LEN 3
&#160;
char buf&#91;LEN&#93;=&#123;'a','b','c'&#125;;
&#160;
void print_backward&#40;int pos&#41;
&#123;
  if &#40;pos == LEN&#41;
    return;
  print_backward&#40;pos+1&#41;;
  putchar&#40;buf&#91;pos&#93;&#41;;
&#125;
&#160;
int main&#40;void&#41;
&#123;
  print_backward&#40;0&#41;;
  putchar&#40;'\n'&#41;;
&#160;
  return 0;
&#125;

<p>其实挺简单的，就是return是return到上次调用的，加上main里的调用，一共调用了4次，第4次时pos=3，直接返回到第三次，第三次就执行了 putchar(buf[pos]);，而此时pos=2，也就是执行了 putchar(buf[2]);，依次类推，分别输出了buf[1],buf[0]，最后返回到了Main函数。
递归很强大，有时候很费解，这样的写法还是要学会的。</p>


<p>关联文章:静态库/动态库的编译和使用方法学习记录
C hash table code
Linux多线程(1)
</p>


关联文章:<ol><li><a href='http://www.vi1129.com/2009/12/make-lib/' rel='bookmark' title='Permanent Link: 静态库/动态库的编译和使用方法学习记录'>静态库/动态库的编译和使用方法学习记录</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/2010/01/mutithread-1/' rel='bookmark' title='Permanent Link: Linux多线程(1)'>Linux多线程(1)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>很久没有写过递归程序，今天被一个小小的递归给困扰了。请教了CSDN的大哥们后，终于想明白了。</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('p420code40'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p42040"><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="p420code40"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.c&gt;</span>
<span style="color: #339933;">#define LEN 3</span>
&nbsp;
<span style="color: #993333;">char</span> buf<span style="color: #009900;">&#91;</span>LEN<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'a'</span><span style="color: #339933;">,</span><span style="color: #ff0000;">'b'</span><span style="color: #339933;">,</span><span style="color: #ff0000;">'c'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> print_backward<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> pos<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">==</span> LEN<span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
  print_backward<span style="color: #009900;">&#40;</span>pos<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  putchar<span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#91;</span>pos<span style="color: #009900;">&#93;</span><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;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  print_backward<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  putchar<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <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>其实挺简单的，就是return是return到上次调用的，加上main里的调用，一共调用了4次，第4次时pos=3，直接返回到第三次，第三次就执行了 putchar(buf[pos]);，而此时pos=2，也就是执行了 putchar(buf[2]);，依次类推，分别输出了buf[1],buf[0]，最后返回到了Main函数。<br />
递归很强大，有时候很费解，这样的写法还是要学会的。</p>


<p>关联文章:<ol><li><a href='http://www.vi1129.com/2009/12/make-lib/' rel='bookmark' title='Permanent Link: 静态库/动态库的编译和使用方法学习记录'>静态库/动态库的编译和使用方法学习记录</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/2010/01/mutithread-1/' rel='bookmark' title='Permanent Link: Linux多线程(1)'>Linux多线程(1)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.vi1129.com/2009/11/recursion/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>MD5应用的一点理解及Linux实现源码</title>
		<link>http://www.vi1129.com/2009/11/linux-md5/</link>
		<comments>http://www.vi1129.com/2009/11/linux-md5/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 07:47:26 +0000</pubDate>
		<dc:creator>keykey</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[程序人生]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[md5]]></category>

		<guid isPermaLink="false">http://www.vi1129.com/?p=306</guid>
		<description><![CDATA[<p>MD5的全称是Message-Digest Algorithm 5（信息-摘要算法），相关的标准是RFC1321,MD5的算法描述可以查看这份RFC或者自己google，这里就不提这些概念性的问题了。</p>
<p>需要说明的是MD5加密是单向不可逆的，也就是说没有办法把已经加密的密文还原为明文。所以最常见的应用在于用户名密码在数据库中的保存，一般的做法是将密码用MD5加密后将密文存入数据库，用户登陆时再将用户输入的明文密码做MD5运算后与数据库进行密文比照，密文比照不符则证明密码输入错误了。所以如果密码丢失了就只能重置，没有人会知道数据库中保存的密文所对应的明文。网上有看到说破解，这个不想做过多研究，仅凭一点经验理解，基本知道只要明文设置的复杂一些，解密几乎是不可能的事情。</p>
<p>最近在做UDP传输过程中的MD5校验，即是将所传输的数据（大约10KB的字串）进行MD5运算，然后把10KB的数据和32位长的MD5值一并发向客户端，客户端收到后再对所收到的10KB字串做MD5运算，与传输过来的MD5值比对，就可知道收到的数据是否有误需要丢弃或通知重传了。或许传输过来的MD5也会有误，不知道这样的问题IETF是怎么考虑的，知道的麻烦告知。</p>
<p>以下是自己整理的一份对字符串MD5加密的源码，留备记录。

md5.h</p>

?View Code C#ifndef MD5_H
#define MD5_H
&#160;
#ifdef __alpha
typedef unsigned int uint32;
#else
typedef unsigned long uint32;
#endif
&#160;
struct MD5Context &#123;
	uint32 buf&#91;4&#93;;
	uint32 bits&#91;2&#93;;
	unsigned char in&#91;64&#93;;
&#125;;
&#160;
void MD5Init&#40;struct MD5Context *context&#41;;
void MD5Update&#40;struct MD5Context *context, unsigned char const *buf,
	       unsigned len&#41;;
void MD5Final&#40;unsigned char digest&#91;16&#93;, struct MD5Context *context&#41;;
void MD5Transform&#40;uint32 buf&#91;4&#93;, uint32 const in&#91;16&#93;&#41;;
&#160;
/*
 * This is needed to make <p><a href="http://www.vi1129.com/2009/11/linux-md5/">继续阅读</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/01/mutithread-1/' rel='bookmark' title='Permanent Link: Linux多线程(1)'>Linux多线程(1)</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><span>MD5的全称是Message-Digest Algorithm 5（信息-摘要算法），相关的标准是<a href="http://www.ietf.org/rfc/rfc1321.txt" target="_blank">RFC1321</a>,MD5的算法描述可以查看这份RFC或者自己google，这里就不提这些概念性的问题了。</span></p>
<p><span>需要说明的是MD5加密是单向不可逆的，也就是说没有办法把已经加密的密文还原为明文。所以最常见的应用在于用户名密码在数据库中的保存，一般的做法是将密码用MD5加密后将密文存入数据库，用户登陆时再将用户输入的明文密码做MD5运算后与数据库进行密文比照，密文比照不符则证明密码输入错误了。所以如果密码丢失了就只能重置，没有人会知道数据库中保存的密文所对应的明文。网上有看到说破解，这个不想做过多研究，仅凭一点经验理解，基本知道只要明文设置的复杂一些，解密几乎是不可能的事情。</span></p>
<p><span>最近在做UDP传输过程中的MD5校验，即是将所传输的数据（大约10KB的字串）进行MD5运算，然后把10KB的数据和32位长的MD5值一并发向客户端，客户端收到后再对所收到的10KB字串做MD5运算，与传输过来的MD5值比对，就可知道收到的数据是否有误需要丢弃或通知重传了。或许传输过来的MD5也会有误，不知道这样的问题IETF是怎么考虑的，知道的麻烦告知。</span></p>
<p><span>以下是自己整理的一份对字符串MD5加密的源码，留备记录。<br />
</span><br />
md5.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('p306code44'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p30644"><td class="code" id="p306code44"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef MD5_H</span>
<span style="color: #339933;">#define MD5_H</span>
&nbsp;
<span style="color: #339933;">#ifdef __alpha</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> uint32<span style="color: #339933;">;</span>
<span style="color: #339933;">#else</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> uint32<span style="color: #339933;">;</span>
<span style="color: #339933;">#endif</span>
&nbsp;
<span style="color: #993333;">struct</span> MD5Context <span style="color: #009900;">&#123;</span>
	uint32 buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	uint32 bits<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">64</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> MD5Init<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> MD5Context <span style="color: #339933;">*</span>context<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> MD5Update<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> MD5Context <span style="color: #339933;">*</span>context<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #993333;">const</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">,</span>
	       <span style="color: #993333;">unsigned</span> len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> MD5Final<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> digest<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">struct</span> MD5Context <span style="color: #339933;">*</span>context<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> MD5Transform<span style="color: #009900;">&#40;</span>uint32 buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> uint32 <span style="color: #993333;">const</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * This is needed to make RSAREF happy on some MS-DOS compilers.
 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> MD5Context MD5_CTX<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#endif /* !MD5_H */</span></pre></td></tr></table></div>

<p>md5.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('p306code45'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p30645"><td class="code" id="p306code45"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*
 * This code implements the MD5 message-digest algorithm.
 * The algorithm is due to Ron Rivest.  This code was
 * written by Colin Plumb in 1993, no copyright is claimed.
 * This code is in the public domain; do with it what you wish.
 *
 * Equivalent code is available from RSA Data Security, Inc.
 * This code has been tested against that, and is equivalent,
 * except that you don't need to include two pages of legalese
 * with every copy.
 *
 * To compute the message digest of a chunk of bytes, declare an
 * MD5Context structure, pass it to MD5Init, call MD5Update as
 * needed on buffers full of bytes, and then call MD5Final, which
 * will fill a supplied 16-byte array with the digest.
 */</span>
<span style="color: #339933;">#include &lt;string.h&gt;		/* for memcpy() */</span>
<span style="color: #339933;">#include &quot;md5.h&quot;</span>
&nbsp;
<span style="color: #339933;">#ifndef HIGHFIRST</span>
<span style="color: #339933;">#define byteReverse(buf, len)	/* Nothing */</span>
<span style="color: #339933;">#else</span>
<span style="color: #993333;">void</span> byteReverse<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> longs<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#ifndef ASM_MD5</span>
<span style="color: #808080; font-style: italic;">/*
 * Note: this code is harmless on little-endian machines.
 */</span>
<span style="color: #993333;">void</span> byteReverse<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> longs<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    uint32 t<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span>
	t <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>uint32<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span><span style="color: #009900;">&#41;</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">8</span> <span style="color: #339933;">|</span> buf<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;">&lt;&lt;</span> <span style="color: #0000dd;">16</span> <span style="color: #339933;">|</span>
	    <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span><span style="color: #009900;">&#41;</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">8</span> <span style="color: #339933;">|</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>uint32 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> buf <span style="color: #339933;">=</span> t<span style="color: #339933;">;</span>
	buf <span style="color: #339933;">+=</span> <span style="color: #0000dd;">4</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>longs<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;">#endif</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
 * initialization constants.
 */</span>
<span style="color: #993333;">void</span> MD5Init<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> MD5Context <span style="color: #339933;">*</span>ctx<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    ctx<span style="color: #339933;">-&gt;</span>buf<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: #208080;">0x67452301</span><span style="color: #339933;">;</span>
    ctx<span style="color: #339933;">-&gt;</span>buf<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: #208080;">0xefcdab89</span><span style="color: #339933;">;</span>
    ctx<span style="color: #339933;">-&gt;</span>buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #208080;">0x98badcfe</span><span style="color: #339933;">;</span>
    ctx<span style="color: #339933;">-&gt;</span>buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #208080;">0x10325476</span><span style="color: #339933;">;</span>
&nbsp;
    ctx<span style="color: #339933;">-&gt;</span>bits<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>
    ctx<span style="color: #339933;">-&gt;</span>bits<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: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * Update context to reflect the concatenation of another buffer full
 * of bytes.
 */</span>
<span style="color: #993333;">void</span> MD5Update<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> MD5Context <span style="color: #339933;">*</span>ctx<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #993333;">const</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> len<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    uint32 t<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* Update bitcount */</span>
&nbsp;
    t <span style="color: #339933;">=</span> ctx<span style="color: #339933;">-&gt;</span>bits<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: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>bits<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> t <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>uint32<span style="color: #009900;">&#41;</span> len <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> t<span style="color: #009900;">&#41;</span>
	ctx<span style="color: #339933;">-&gt;</span>bits<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: #808080; font-style: italic;">/* Carry from low to high */</span>
    ctx<span style="color: #339933;">-&gt;</span>bits<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> len <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">29</span><span style="color: #339933;">;</span>
&nbsp;
    t <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>t <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x3f</span><span style="color: #339933;">;</span>	<span style="color: #808080; font-style: italic;">/* Bytes already in shsInfo-&gt;data */</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* Handle any leading odd-sized chunks */</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> ctx<span style="color: #339933;">-&gt;</span>in <span style="color: #339933;">+</span> t<span style="color: #339933;">;</span>
&nbsp;
	t <span style="color: #339933;">=</span> <span style="color: #0000dd;">64</span> <span style="color: #339933;">-</span> t<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>len <span style="color: #339933;">&lt;</span> t<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    memcpy<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">,</span> buf<span style="color: #339933;">,</span> len<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>
	memcpy<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">,</span> buf<span style="color: #339933;">,</span> t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	byteReverse<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #339933;">,</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	MD5Transform<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>buf<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>uint32 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	buf <span style="color: #339933;">+=</span> t<span style="color: #339933;">;</span>
	len <span style="color: #339933;">-=</span> t<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #808080; font-style: italic;">/* Process data in 64-byte chunks */</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>len <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">64</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	memcpy<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #339933;">,</span> buf<span style="color: #339933;">,</span> <span style="color: #0000dd;">64</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	byteReverse<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #339933;">,</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	MD5Transform<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>buf<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>uint32 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	buf <span style="color: #339933;">+=</span> <span style="color: #0000dd;">64</span><span style="color: #339933;">;</span>
	len <span style="color: #339933;">-=</span> <span style="color: #0000dd;">64</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* Handle any remaining bytes of data. */</span>
&nbsp;
    memcpy<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #339933;">,</span> buf<span style="color: #339933;">,</span> len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * Final wrapup - pad to 64-byte boundary with the bit pattern 
 * 1 0* (64-bit count of bits processed, MSB-first)
 */</span>
<span style="color: #993333;">void</span> MD5Final<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> digest<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">struct</span> MD5Context <span style="color: #339933;">*</span>ctx<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">unsigned</span> count<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>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* Compute number of bytes mod 64 */</span>
    count <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>bits<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x3F</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* Set the first char of padding to 0x80.  This is safe since there is
       always at least one byte free */</span>
    p <span style="color: #339933;">=</span> ctx<span style="color: #339933;">-&gt;</span>in <span style="color: #339933;">+</span> count<span style="color: #339933;">;</span>
    <span style="color: #339933;">*</span>p<span style="color: #339933;">++</span> <span style="color: #339933;">=</span> <span style="color: #208080;">0x80</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* Bytes of padding needed to make 64 bytes */</span>
    count <span style="color: #339933;">=</span> <span style="color: #0000dd;">64</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">-</span> count<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* Pad out to 56 mod 64 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>count <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #808080; font-style: italic;">/* Two lots of padding:  Pad the first block to 64 bytes */</span>
	memset<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> count<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	byteReverse<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #339933;">,</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	MD5Transform<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>buf<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>uint32 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* Now fill the next block with 56 bytes */</span>
	memset<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">56</span><span style="color: #009900;">&#41;</span><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;">/* Pad block to 56 bytes */</span>
	memset<span style="color: #009900;">&#40;</span>p<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> count <span style="color: #339933;">-</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    byteReverse<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #339933;">,</span> <span style="color: #0000dd;">14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* Append length in bits and transform */</span>
    <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>uint32 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">14</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> ctx<span style="color: #339933;">-&gt;</span>bits<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: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>uint32 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> ctx<span style="color: #339933;">-&gt;</span>bits<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    MD5Transform<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">-&gt;</span>buf<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>uint32 <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> ctx<span style="color: #339933;">-&gt;</span>in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    byteReverse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> ctx<span style="color: #339933;">-&gt;</span>buf<span style="color: #339933;">,</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    memcpy<span style="color: #009900;">&#40;</span>digest<span style="color: #339933;">,</span> ctx<span style="color: #339933;">-&gt;</span>buf<span style="color: #339933;">,</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    memset<span style="color: #009900;">&#40;</span>ctx<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>ctx<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #808080; font-style: italic;">/* In case it's sensitive */</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #339933;">#ifndef ASM_MD5</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* The four core functions - F1 is optimized somewhat */</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* #define F1(x, y, z) (x &amp; y | ~x &amp; z) */</span>
<span style="color: #339933;">#define F1(x, y, z) (z ^ (x &amp; (y ^ z)))</span>
<span style="color: #339933;">#define F2(x, y, z) F1(z, x, y)</span>
<span style="color: #339933;">#define F3(x, y, z) (x ^ y ^ z)</span>
<span style="color: #339933;">#define F4(x, y, z) (y ^ (x | ~z))</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* This is the central step in the MD5 algorithm. */</span>
<span style="color: #339933;">#define MD5STEP(f, w, x, y, z, data, s) \
	( w += f(x, y, z) + data,  w = w&lt;&lt;s | w&gt;&gt;(32-s),  w += x )</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * The core of the MD5 algorithm, this alters an existing MD5 hash to
 * reflect the addition of 16 longwords of new data.  MD5Update blocks
 * the data and converts bytes into longwords for this routine.
 */</span>
<span style="color: #993333;">void</span> MD5Transform<span style="color: #009900;">&#40;</span>uint32 buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> uint32 <span style="color: #993333;">const</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">register</span> uint32 a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">;</span>
&nbsp;
    a <span style="color: #339933;">=</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    b <span style="color: #339933;">=</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    c <span style="color: #339933;">=</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    d <span style="color: #339933;">=</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<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: #208080;">0xd76aa478</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<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: #208080;">0xe8c7b756</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x242070db</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">17</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xc1bdceee</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">22</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<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: #208080;">0xf57c0faf</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<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: #208080;">0x4787c62a</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xa8304613</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">17</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<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: #208080;">0xfd469501</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">22</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x698098d8</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x8b44f7af</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xffff5bb1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">17</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x895cd7be</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">22</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x6b901122</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xfd987193</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">14</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xa679438e</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">17</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F1<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x49b40821</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">22</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<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: #208080;">0xf61e2562</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xc040b340</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x265e5a51</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<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: #208080;">0xe9b6c7aa</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<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: #208080;">0xd62f105d</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x02441453</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xd8a1e681</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<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: #208080;">0xe7d3fbc8</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x21e1cde6</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">14</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xc33707d6</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xf4d50d87</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x455a14ed</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xa9e3e905</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xfcefa3f8</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<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: #208080;">0x676f02d9</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F2<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x8d2a4c8a</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<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: #208080;">0xfffa3942</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x8771f681</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">11</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x6d9d6122</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">14</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xfde5380c</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">23</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<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: #208080;">0xa4beea44</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<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: #208080;">0x4bdecfa9</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">11</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<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: #208080;">0xf6bb4b60</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xbebfbc70</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">23</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x289b7ec6</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<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: #208080;">0xeaa127fa</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">11</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xd4ef3085</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x04881d05</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">23</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xd9d4d039</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xe6db99e5</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">11</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x1fa27cf8</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F3<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xc4ac5665</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">23</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<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: #208080;">0xf4292244</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<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: #208080;">0x432aff97</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">14</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xab9423a7</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">15</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<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: #208080;">0xfc93a039</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">21</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x655b59c3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x8f0ccc92</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xffeff47d</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">15</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<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: #208080;">0x85845dd1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">21</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x6fa87e4f</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xfe2ce6e0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xa3014314</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">15</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x4e0811a1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">21</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> in<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: #208080;">0xf7537e82</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xbd3af235</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0x2ad7d2bb</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">15</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MD5STEP<span style="color: #009900;">&#40;</span>F4<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> in<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #208080;">0xeb86d391</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">21</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> a<span style="color: #339933;">;</span>
    buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> b<span style="color: #339933;">;</span>
    buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> c<span style="color: #339933;">;</span>
    buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> d<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #339933;">#endif</span></pre></td></tr></table></div>

<p>md5test.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('p306code46'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p30646"><td class="code" id="p306code46"><pre class="c" style="font-family:monospace;"><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 &quot;md5.h&quot;</span>
&nbsp;
<span style="color: #993333;">void</span> md5str<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span> str<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;">unsigned</span> <span style="color: #993333;">char</span> chappassword<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> len<span style="color: #339933;">=</span>strlen<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	MD5_CTX context<span style="color: #339933;">;</span>
	MD5Init<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>context<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	MD5Update<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>context<span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>str<span style="color: #339933;">,</span>len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	MD5Final<span style="color: #009900;">&#40;</span>chappassword<span style="color: #339933;">,&amp;</span>context<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><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</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;%02x&quot;</span><span style="color: #339933;">,</span>chappassword<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</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;<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: #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><span style="color: #339933;">*</span> password<span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;hello&quot;</span><span style="color: #339933;">;</span>
	md5str<span style="color: #009900;">&#40;</span>password<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/01/mutithread-1/' rel='bookmark' title='Permanent Link: Linux多线程(1)'>Linux多线程(1)</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/2009/11/linux-md5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
