Here is a simple piece of code that demonstrates how :
<code>1</code>
<code>#include <stdio.h></code>
<code>2</code>
<code>#include <string.h></code>
<code>3</code>
<code>#include <sys/types.h></code>
<code>4</code>
<code>#include <sys/socket.h></code>
<code>5</code>
<code>#include <sys/ioctl.h></code>
<code>6</code>
<code>#include <netinet/in.h></code>
<code>7</code>
<code>#include <net/if.h></code>
<code>8</code>
<code>#include <unistd.h></code>
<code>9</code>
<code>#include <arpa/inet.h></code>
<code>10</code>
<code>11</code>
<code>int</code> <code>main()</code>
<code>12</code>
<code>{</code>
<code>13</code>
<code> </code><code>int</code> <code>fd;</code>
<code>14</code>
<code> </code><code>struct</code> <code>ifreq ifr;</code>
<code>15</code>
<code> </code>
<code>16</code>
<code> </code><code>char</code> <code>iface[] = </code><code>"eth0"</code><code>;</code>
<code>17</code>
<code>18</code>
<code> </code><code>fd = socket(AF_INET, SOCK_DGRAM, 0);</code>
<code>19</code>
<code>20</code>
<code> </code><code>//Type of address to retrieve - IPv4 IP address</code>
<code>21</code>
<code> </code><code>ifr.ifr_addr.sa_family = AF_INET;</code>
<code>22</code>
<code>23</code>
<code> </code><code>//Copy the interface name in the ifreq structure</code>
<code>24</code>
<code> </code><code>strncpy</code><code>(ifr.ifr_name , iface , IFNAMSIZ-1);</code>
<code>25</code>
<code>26</code>
<code> </code><code>ioctl(fd, SIOCGIFADDR, &ifr);</code>
<code>27</code>
<code>28</code>
<code> </code><code>close(fd);</code>
<code>29</code>
<code>30</code>
<code> </code><code>//display result</code>
<code>31</code>
<code> </code><code>printf</code><code>(</code><code>"%s - %s\n"</code> <code>, iface , inet_ntoa(( (</code><code>struct</code> <code>sockaddr_in *)&ifr.ifr_addr )->sin_addr) );</code>
<code>32</code>
<code>33</code>
<code> </code><code>return</code> <code>0;</code>
<code>34</code>
<code>}</code>
<code>$ gcc ioctl.c && ./a.out</code>
<code>eth0 - 192.168.0.6</code>
The socket used can be a TCP socket (SOCK_STREAM) as well.
If you also need the netmask then use the SIOCGIFNETMASK value in ioctl like this :
<code> </code><code>//get the ip address</code>
<code> </code><code>//display ip</code>
<code> </code><code>printf</code><code>(</code><code>"IP address of %s - %s\n"</code> <code>, iface , inet_ntoa(( (</code><code>struct</code> <code>sockaddr_in *)&ifr.ifr_addr )->sin_addr) );</code>
<code> </code><code>//get the netmask ip</code>
<code> </code><code>ioctl(fd, SIOCGIFNETMASK, &ifr);</code>
<code> </code><code>//display netmask</code>
<code> </code><code>printf</code><code>(</code><code>"Netmask of %s - %s\n"</code> <code>, iface , inet_ntoa(( (</code><code>struct</code> <code>sockaddr_in *)&ifr.ifr_addr )->sin_addr) );</code>
<code>35</code>
<code>36</code>
<code>37</code>
<code>38</code>
<code>39</code>
Output :
<code>IP address of eth0 - 192.168.0.6</code>
<code>Netmask of eth0 - 255.255.255.0</code>
==============================================================================
本文轉自被遺忘的部落格園部落格,原文連結:http://www.cnblogs.com/rollenholt/archive/2012/07/11/2586157.html,如需轉載請自行聯系原作者