天天看點

根據網卡名擷取IP位址,以及掩碼位址

Here is a simple piece of code that demonstrates how :

<code>1</code>

<code>#include &lt;stdio.h&gt;</code>

<code>2</code>

<code>#include &lt;string.h&gt;</code>

<code>3</code>

<code>#include &lt;sys/types.h&gt;</code>

<code>4</code>

<code>#include &lt;sys/socket.h&gt;</code>

<code>5</code>

<code>#include &lt;sys/ioctl.h&gt;</code>

<code>6</code>

<code>#include &lt;netinet/in.h&gt;</code>

<code>7</code>

<code>#include &lt;net/if.h&gt;</code>

<code>8</code>

<code>#include &lt;unistd.h&gt;</code>

<code>9</code>

<code>#include &lt;arpa/inet.h&gt;</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, &amp;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 *)&amp;ifr.ifr_addr )-&gt;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 &amp;&amp; ./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 *)&amp;ifr.ifr_addr )-&gt;sin_addr) );</code>

<code>    </code><code>//get the netmask ip</code>

<code>    </code><code>ioctl(fd, SIOCGIFNETMASK, &amp;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 *)&amp;ifr.ifr_addr )-&gt;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,如需轉載請自行聯系原作者

繼續閱讀