
Introduction
I needed some code that would give me the IP number of my machine. Not only the number
assigned to it by DHCP, either on a LAN or by my ISP when dialing up, but also my IP number
as seen from the web, if my machine is behind a router/firewall.
It took a while before I figured it all out, and in the process I have seen a lot of code from others.
I borrowed some code here and there, but I don't remember exactly what part, so it is hard to give credits
to the authors of that code. Sorry about that. Hope I can make it up by sharing this code with you.
Relevant functions in the sample source code
The sample program does essentially two things: it reports the IP numbers as 'known' by the TCP/IP
software on your own machine ('internal' IP numbers) and it reports the IP numbers of your machine
as seen from the web ('external' IP numbers).
Of course one of the internal numbers will be the same as the external number if there is no router/firewall
between your machine and the Internet.
Internal IP numbers
Internal IP numbers are reported by function FindLocalAddress()
. It calls
GetIpAddrTable()
, one of the
IP Helper functions, which returns a block of data with this structure:
typedef struct _MIB_IPADDRTABLE
{
DWORD dwNumEntries;
MIB_IPADDRROW table[ANY_SIZE];
} MIB_IPADDRTABLE, *PMIB_IPADDRTABLE;
dwNumEntries
contains the number of entries in 'table'.
The structure of 'table' looks like this:
typedef struct _MIB_IPADDRROW
{
DWORD dwAddr;
DWORD dwIndex;
DWORD dwMask;
DWORD dwBCastAddr;
DWORD dwReasmSize;
unsigned short unused1;
unsigned short wType;
} MIB_IPADDRROW, *PMIB_IPADDRROW;
dwAddr
is the address we are after. FindLocalAddresses()
fetches that number and converts it to a xxx.xxx.xxx.xxx string by calling function
inet_ntoa()
.
External IP numbers
External IP numbers are reported by function FindWebAddress()
. It does this by making a connection
to URL 'checkip.dyndns.org'. To see why, open this URL in your browser. It returns the IP number of your
machine as seen from this site. If your machine is behind a firewall/router this number will differ from
the internal IP numbers found earlier. Of course in this case the IP number found will in fact be the IP
number of your router/firewall.
FindWebAddress()
uses the WinINet API to make a connection to 'checkip.dyndns.org' and to read and
parse its HTML source to find the IP number hidden in this HTML source.
How to pass through an authenticating proxy server
FindWebAddress()
also shows you how to pass through a proxy server that requires authentication. The sample
program creates its CInternetSession
object with option INTERNET_OPEN_TYPE_PRECONFIG
. This means that
if your Internet Explorer configuration contains a proxy server definition ("Tools - Internet Options -
Connection tab - LAN Settings..."), the Internet connection will be made through this proxy server.
In that case you will know that you have to pass through an authenticating proxy when your first attempt to
connect to 'checkip.dyndns.org' fails with return code 407. The sample program will then ask you to specify a
username and a password, and tries to connect to 'checkip.dyndns.org' through the proxy server.
About the author
My name is Nico Cuppen. I live in Haarlem, The Netherlands and I like programming. That's how I became a
shareware author. You can find more info about me and my products on
www.nicocuppen.com.