天天看點

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

nterface name is something like “eth0″ and the ip address of the interface can be retrieved using the ioctl function.

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>

繼續閱讀