[vox-tech] getting IP address in C
Michael Wenk
vox-tech@lists.lugod.org
Wed, 16 Apr 2003 08:34:09 -0700
On Wednesday 16 April 2003 05:59 am, Ryan wrote:
> My machine has two IPs I guess. 127.0.0.1 and 64.167.231.194.
> I want to be able to detect the 64.167.231.194.
>
> Here is what I ended up doing to solve the problem
>
> /*detecting hostname and ip*/
> printf("Getting hostname....\n");
> gethostname(hostname, 256);
> printf("Found %s... sound good to you?\n", hostname);
>
> printf("Getting IP Address now...\n");
> h_entry = gethostbyname(hostname);
> if(h_entry == 0) crash("gethostbyname()");
>
> printf("Aha! found %s\n", inet_ntoa(*((struct in_addr
> *)h_entry->h_addr)));
> inet_aton(h_entry->h_addr, &adr_server.sin_addr);
>
> len_inet = sizeof(adr_server);
> /*************************/
>
The biggest problem is when your system has multiple adresses(And I don't
include the loopback address.) You see this when you have systems with
virtual hosts, or multi homed systems(My own system is an example of this.)
For example my local system:
eth0 Link encap:Ethernet HWaddr 00:04:5A:87:08:07
inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:728145 errors:0 dropped:0 overruns:0 frame:0
TX packets:662645 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:118078376 (112.6 Mb) TX bytes:454448771 (433.3 Mb)
Interrupt:11 Base address:0xe000
eth1 Link encap:Ethernet HWaddr 00:A0:CC:29:F0:D3
inet addr:12.209.95.93 Bcast:255.255.255.255 Mask:255.255.254.0
UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3237857 errors:1 dropped:0 overruns:0 frame:3
TX packets:636079 errors:3 dropped:0 overruns:3 carrier:0
collisions:0 txqueuelen:100
RX bytes:622292879 (593.4 Mb) TX bytes:88681685 (84.5 Mb)
Interrupt:11 Base address:0xe400
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:37759 errors:0 dropped:0 overruns:0 frame:0
TX packets:37759 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4609422 (4.3 Mb) TX bytes:4609422 (4.3 Mb)
There are three adresses, and the name of the system doesn't directly map to
any of the systems addresses. Since the last time I had to do anything even
near this, I was programming a tool on HP-UX which implements an extension to
the standard library, I must admit I am clueless. So, I went and checked the
source. Apparently, ifconfig reads /proc/net/dev for a list of
interfaces(plus some stats), and then goes thru and runs some ioctls(and
possibly other stuff) to determine what the address is on them. Im not sure
if this is what you were looking for or not. If you're ok with your program
as is, then great. Just remember that depending on the system you are on may
change, and if it does and is more convoluted in configuration, your program
may be invalid. Its a PITA, but hey, its life.
Mike
--
wenk@praxis.homedns.org
Mike Wenk