<?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; getifaddrs</title>
	<atom:link href="http://www.vi1129.com/tag/getifaddrs/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>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('p617code5'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6175"><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="p617code5"><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('p617code6'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6176"><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="p617code6"><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('p617code7'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6177"><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="p617code7"><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('p617code8'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6178"><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="p617code8"><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>
	</channel>
</rss>
