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 <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>