<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=KOI8-R" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Here is several ways to determine IP address..<br>
<br>
<hr size="2" width="100%"><b>#1 Using WSAIoctl Winsock2 with
SIO_ADDRESS_LIST_QUERY</b><br>
<br>
#includeššš &lt;iostream&gt;<br>
#includeššš &lt;winsock2.h&gt;<br>
<br>
#pragmaššššššš comment (lib, "ws2_32.lib")<br>
<br>
int main(void)<br>
{<br>
ššš usingššššššššššš std::cout;<br>
ššš usingššššššššššš std::cerr;<br>
ššš usingššššššššššš std::endl;<br>
<br>
ššš WSADATAššššššš wd;<br>
ššš SOCKETššššššš sock;<br>
ššš charššššššššššš buf[65535];<br>
ššš DWORDššššššššššš dwSize = 65535;<br>
ššš intššššššššššššššš nRet;<br>
ššš SOCKET_ADDRESS_LIST *pAddr;<br>
ššš SOCKADDR*ššš saddr;<br>
ššš <br>
ššš nRet = WSAStartup(MAKEWORD(2,0), &amp;wd);<br>
ššš if(nRet != 0){<br>
ššššššš cerr &lt;&lt; "WSAStartup fail with code " &lt;&lt; nRet
&lt;&lt; endl;<br>
ššššššš return -1;<br>
ššš }<br>
ššš sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<br>
ššš if(sock == INVALID_SOCKET){<br>
ššššššš cerr &lt;&lt; "socket fail with code " &lt;&lt;
WSAGetLastError() &lt;&lt; endl;<br>
ššššššš return -2;<br>
ššš }<br>
ššš ZeroMemory(buf, 65535);<br>
ššš nRet = WSAIoctl(sock, SIO_ADDRESS_LIST_QUERY, NULL, 0, buf, 65535,
&amp;dwSize, NULL, NULL);<br>
ššš if(nRet != SOCKET_ERROR){<br>
ššššššš pAddr = reinterpret_cast&lt;SOCKET_ADDRESS_LIST*&gt;(buf);<br>
ššššššš nRet = pAddr-&gt;iAddressCount;<br>
ššššššš saddr = pAddr-&gt;Address-&gt;lpSockaddr;<br>
ššššššš while (0 &lt; nRet--){<br>
ššššššššššš cout &lt;&lt;
inet_ntoa(reinterpret_cast&lt;SOCKADDR_IN*&gt;(saddr)-&gt;sin_addr)
&lt;&lt; endl;<br>
ššššššššššš saddr++;<br>
ššššššš }<br>
ššššššš nRet = 0;<br>
ššš }else {<br>
ššššššš cerr &lt;&lt; "WSAIoctl fail with code " &lt;&lt;
WSAGetLastError() &lt;&lt; endl;<br>
ššššššš nRet = -3;<br>
ššš }<br>
ššš closesocket(sock);<br>
ššš WSACleanup();<br>
ššš return nRet;<br>
}<br>
<br>
<hr size="2" width="100%"><b>#2 Using IP Helper API</b><br>
<br>
#includeššš &lt;iostream&gt;<br>
#includeššš &lt;windows.h&gt;<br>
#includeššš &lt;iphlpapi.h&gt;<br>
<br>
#pragmaššššššš comment (lib, "iphlpapi")<br>
<br>
void main (void)<br>
{<br>
ššš usingššššššššššššššššššššššššššš std::cout;<br>
ššš usingššššššššššššššššššššššššššš std::cerr;<br>
ššš usingššššššššššššššššššššššššššš std::endl;<br>
ššš <br>
ššš char*ššššššššššššššššššššššššššš buf;<br>
ššš PIP_ADAPTER_INFOššš pAdaptersInfo;<br>
ššš PIP_ADDR_STRINGššššššš pAddr;<br>
ššš DWORDššššššššššššššššššššššššššš dwSize = 0;<br>
<br>
ššš if(GetAdaptersInfo(NULL, &amp;dwSize) != ERROR_BUFFER_OVERFLOW){<br>
ššššššš cerr &lt;&lt; "GetAdaptersInfo fail" &lt;&lt; endl;<br>
ššššššš return;<br>
ššš }<br>
ššš buf = new char[dwSize];<br>
ššš if (!buf) return;<br>
ššš pAdaptersInfo = reinterpret_cast&lt;PIP_ADAPTER_INFO&gt;(buf);<br>
ššš if (GetAdaptersInfo (pAdaptersInfo, &amp;dwSize) == ERROR_SUCCESS){<br>
ššššššš while (pAdaptersInfo){<br>
ššššššššššš pAddr = &amp;pAdaptersInfo-&gt;IpAddressList;<br>
ššššššššššš while (pAddr){<br>
ššššššššššššššš cout &lt;&lt;"Address: " &lt;&lt;
pAddr-&gt;IpAddress.String &lt;&lt; "/" &lt;&lt; <br>
ššššššššššššššššššš pAddr-&gt;IpMask.String &lt;&lt; endl;<br>
ššššššššššššššš pAddr = pAddr-&gt;Next;<br>
ššššššššššš }<br>
ššššššššššš pAdaptersInfo = pAdaptersInfo-&gt;Next;<br>
ššššššš }<br>
ššš }<br>
ššš delete[] buf;<br>
}<br>
<br>
<hr size="2" width="100%"><b>#3 The easiest one.</b><br>
<br>
#includeššš &lt;iostream&gt;<br>
#includeššš &lt;winsock2.h&gt;<br>
<br>
#pragmaššššššš comment (lib, "ws2_32.lib")<br>
<br>
int main(void)<br>
{<br>
ššš usingššššššššššš std::cout;<br>
ššš usingššššššššššš std::cerr;<br>
ššš usingššššššššššš std::endl;<br>
<br>
ššš WSADATAššššššššššš wd;<br>
ššš charššššššššššš buf[65535];<br>
ššš intššššššššššššššš nRet;<br>
ššš struct hostentššš *phe;<br>
ššš struct in_addrššš *paddr;<br>
ššš <br>
ššš nRet = WSAStartup(MAKEWORD(1, 1), &amp;wd);<br>
ššš if(nRet != 0){<br>
ššššššš cerr &lt;&lt; "WSAStartup fail with code " &lt;&lt; nRet
&lt;&lt; endl;<br>
ššššššš return -1;<br>
ššš }<br>
ššš if(gethostname(buf, 65535) != SOCKET_ERROR){<br>
ššššššš phe = gethostbyname(buf);<br>
ššššššš if(phe != 0){<br>
ššššššššššš while(phe-&gt;h_addr_list[nRet]){<br>
ššššššššššššššš paddr = reinterpret_cast&lt;struct
in_addr*&gt;(phe-&gt;h_addr_list[nRet++]);<br>
ššššššššššššššš cout &lt;&lt; inet_ntoa(*paddr) &lt;&lt; endl;<br>
ššššššššššš }<br>
ššššššš }<br>
ššš }<br>
ššš WSACleanup();<br>
ššš return nRet;<br>
}<br>
<br>
<hr size="2" width="100%"><b>#4 Broadcasting and determining network
configuration</b><br>
<br>
#include &lt;ioctl.h&gt;<br>
#include &lt;stdio.h&gt;<br>
#include &lt;stdlib.h&gt;<br>
#include &lt;string.h&gt;<br>
#include &lt;sys/socket.h&gt;<br>
#include &lt;arpa/inet.h&gt;<br>
#include &lt;net/if.h&gt;<br>
#include &lt;netinet/in.h&gt;<br>
int <br>
main (int argc, char *argv[])<br>
{<br>
ššššš int sock;<br>
ššššš struct ifconf d;<br>
ššššš struct ifreq *ifr, *end, *cur, *temp;<br>
ššššš char buffer[128];<br>
ššššš if ((sock= socket (AF_INET, SOCK_DGRAM, 0)) == -1) {<br>
ššššššššššš perror ("socket");<br>
ššššššššššš exit (EXIT_FAILURE);<br>
ššššš }<br>
ššššš /* temporary storage for getting broadcast address */<br>
ššššš temp= (struct ifreq *)buffer;<br>
ššššš d.ifc_len= 4096;<br>
ššššš d.ifc_buf= malloc (d.ifc_len);<br>
ššššš if (ioctl (sock, SIOCGIFCONF, &amp;d) == -1) {<br>
ššššššššššš perror ("ioctl (SIOCGIFCONF)");<br>
ššššššššššš exit (EXIT_FAILURE);<br>
ššššš }<br>
ššššš /*<br>
šššššš * Note that the ifreq structure is variable length so we have to
step <br>
šššššš * along the structure by the size of the prev structure <br>
šššššš */<br>
ššššš ifr= (struct ifreq *) d.ifc_req;<br>
ššššš end= (struct ifreq *) ((char *) ifr + d.ifc_len);<br>
ššššš while (ifr &lt; end) {<br>
ššššššššššš cur= ifr;<br>
ššššššššššš /* step along the array by the size of the current
structure */<br>
ššššššššššš ifr=(struct ifreq *)((char *)ifr + ifr-&gt;ifr_addr.sa_len
+ IFNAMSIZ);<br>
ššššššššššš /* if this isn't in the INET address family ignore */<br>
ššššššššššš if (cur-&gt;ifr_addr.sa_family != AF_INET)<br>
ššššššššššššššššš continue;šš <br>
ššššššššššš /* save aside the ifr structure to get the broadcast addr */<br>
ššššššššššš memcpy(temp, cur, cur-&gt;ifr_addr.sa_len + IFNAMSIZ);<br>
š<br>
ššššššššššš printf ("%s (%s) ", cur-&gt;ifr_name, inet_ntoa(((struct
sockaddr_in *)<br>
šššššššššššššššššššššššššššššššššššššššššššššššš
&amp;cur-&gt;ifr_addr)-&gt;sin_addr));<br>
ššššššššššš /* get the flags for this interface */<br>
ššššššššššš if (ioctl (sock, SIOCGIFFLAGS, (char *) cur) &lt; 0) {<br>
ššššššššššššššššš perror ("ioctl (SIOCGIFFLAGS)");<br>
ššššššššššššššššš exit (EXIT_FAILURE);<br>
ššššššššššš }<br>
ššššššššššš /* if the interface is up, print out some information about
it */<br>
ššššššššššš if (cur-&gt;ifr_flags &amp; IFF_UP) {<br>
ššššššššššššššššš if (cur-&gt;ifr_flags &amp; IFF_BROADCAST) {<br>
ššššššššššššššššššššššš printf ("broadcast ");<br>
ššššššššššššššššššššššš if (ioctl(sock, SIOCGIFBRDADDR, (char *)temp)
!= -1)<br>
ššššššššššššššššššššššššššššš printf("%s ", inet_ntoa(((struct
sockaddr_in *)<br>
šššššššššššššššššššššššššššššššššššššššššššššššš
&amp;temp-&gt;ifr_addr)-&gt;sin_addr));<br>
ššššššššššššššššššššššš else {<br>
ššššššššššššššššššššššššššššš perror("ioctl (SIOCGIFBRDADDR)");<br>
ššššššššššššššššššššššššššššš exit(EXIT_FAILURE);<br>
ššššššššššššššššššššššš }<br>
ššššššššššššššššš }<br>
ššššššššššššššššš if (cur-&gt;ifr_flags &amp; IFF_POINTOPOINT) {<br>
ššššššššššššššššššššššš printf ("point-to-point dst ");<br>
ššššššššššššššššššššššš if (ioctl(sock, SIOCGIFDSTADDR, (char *)temp)
!= -1)<br>
ššššššššššššššššššššššššššššš printf("%s ", inet_ntoa(((struct
sockaddr_in *)<br>
šššššššššššššššššššššššššššššššššššššššššššššššš
&amp;cur-&gt;ifr_addr)-&gt;sin_addr));<br>
ššššššššššššššššššššššš else {<br>
ššššššššššššššššššššššššššššš perror("ioctl (SIOCGIFDSTADDR)");<br>
ššššššššššššššššššššššššššššš exit(EXIT_FAILURE);<br>
ššššššššššššššššššššššš }<br>
ššššššššššššššššš }<br>
ššššššššššš }<br>
ššššššššššš putc ('\n', stdout);<br>
ššššš }<br>
ššššš return EXIT_SUCCESS;<br>
}<br>
<br>
<hr size="2" width="100%"><b>#5 Usingš SNMP Extension Agent API</b><br>
<br>
#includeššš &lt;iostream&gt;<br>
#includeššš &lt;winsock2.h&gt;<br>
#includeššš &lt;snmp.h&gt;<br>
<br>
#pragmaššššššš comment(lib, "snmpapi.lib")<br>
#pragmaššššššš comment(lib, "ws2_32.lib")<br>
<br>
namespace bsnmp {<br>
ššš PFNSNMPEXTENSIONINITššš SnmpExtensionInit;<br>
ššš PFNSNMPEXTENSIONQUERYššš SnmpExtensionQuery;<br>
};<br>
<br>
int main(void)<br>
{<br>
ššš HANDLEššššššššššššššššššš hPollForTrapEvent;<br>
ššš AsnObjectIdentifierššššššš SupportedView;<br>
ššš HMODULEššššššššššššššššššš hLib;<br>
ššš UINTššššššššššššššššššš OID[] = { 1, 3, 6, 1, 2, 1, 4 , 20, 1 ,1 };<br>
ššš SnmpVarBindListššššššššššš SVBList;<br>
ššš SnmpVarBindššššššššššššššš SVBVars[1];<br>
ššš AsnObjectIdentifierššššššš AsnOID = { sizeof(OID)/sizeof(UINT), OID
};<br>
ššš AsnInteger32ššššššššššš ErrorStatus, ErrorIndex;<br>
<br>
ššš hLib = LoadLibrary("inetmib1.dll");<br>
ššš if (!hLib){<br>
ššššššš std::cerr &lt;&lt; "Loadlibrary fail" &lt;&lt; std::endl;<br>
ššššššš return -1;<br>
ššš }<br>
ššš bsnmp::SnmpExtensionInit =
reinterpret_cast&lt;PFNSNMPEXTENSIONINIT&gt;(GetProcAddress(hLib,
"SnmpExtensionInit"));<br>
ššš bsnmp::SnmpExtensionQuery =
reinterpret_cast&lt;PFNSNMPEXTENSIONQUERY&gt;(GetProcAddress(hLib,
"SnmpExtensionQuery"));<br>
ššš if(!bsnmp::SnmpExtensionInit || !bsnmp::SnmpExtensionQuery){<br>
ššššššš std::cerr &lt;&lt; "GetProcAddress fail" &lt;&lt; std::endl;<br>
ššššššš return -2;<br>
ššš }<br>
ššš if(bsnmp::SnmpExtensionInit(0, &amp;hPollForTrapEvent,
&amp;SupportedView)){<br>
ššššššš SVBList.len = 1;<br>
ššššššš SVBList.list = SVBVars;<br>
ššššššš SnmpUtilOidCpy(&amp;SVBVars[0].name, &amp;AsnOID);<br>
ššššššš while(true){<br>
ššššššššššš if(bsnmp::SnmpExtensionQuery(ASN_RFC1157_GETNEXTREQUEST,
&amp;SVBList, &amp;ErrorStatus, &amp;ErrorIndex) != 0){<br>
ššššššššššššššš if(SnmpUtilOidNCmp(&amp;SVBVars[0].name, &amp;AsnOID,
AsnOID.idLength)) break;<br>
ššššššššššššššš std::cout &lt;&lt;
inet_ntoa(*reinterpret_cast&lt;struct
in_addr*&gt;(SVBVars[0].value.asnValue.address.stream))<br>
ššššššššššššššššššš &lt;&lt; std::endl;<br>
ššššššššššš }else break;<br>
ššššššš }<br>
ššššššš SnmpUtilOidFree(&amp;SVBVars[0].name);<br>
ššš }else {<br>
ššššššš std::cerr &lt;&lt; "SnmpExtensionInit fail" &lt;&lt; std::endl;<br>
ššš }<br>
ššš FreeLibrary(hLib);<br>
ššš return 0;<br>
}<br>
<br>
<hr size="2" width="100%"><b>#6 Using WinPCAP</b><br>
<br>
#include "pcap.h"<br>
#include "pcap-int.h"<br>
<br>
#include &lt;ntddndis.h&gt;<br>
#pragmašššš comment(lib, "packet.lib")<br>
<br>
#ifndef WIN32<br>
#include &lt;sys/socket.h&gt;<br>
#include &lt;netinet/in.h&gt;<br>
#else<br>
#include &lt;winsock.h&gt;<br>
#endif<br>
<br>
void ifprint(pcap_if_t *d);<br>
char *iptos(u_long in);<br>
int getmac(pcap_t* ha, char* pStr);<br>
<br>
int main()<br>
{<br>
š pcap_if_t *alldevs;<br>
š pcap_if_t *d;<br>
š char errbuf[PCAP_ERRBUF_SIZE+1];<br>
<br>
š if (pcap_findalldevs(&amp;alldevs, errbuf) == -1)<br>
š {<br>
ššš fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);<br>
ššš exit(1);<br>
š }<br>
<br>
š for(d=alldevs;d;d=d-&gt;next)<br>
š {<br>
ššš ifprint(d);<br>
š }<br>
<br>
š return 1;<br>
}<br>
<br>
void ifprint(pcap_if_t *d)<br>
{<br>
š pcap_addr_t *a;<br>
š pcap_tššššš *hadapter;<br>
š charššššššššš pMAC[20];<br>
š printf("%s\n",d-&gt;name);<br>
š if (d-&gt;description)<br>
ššš printf("\tDescription: %s\n",d-&gt;description);<br>
š printf("\tLoopback: %s\n",(d-&gt;flags &amp;
PCAP_IF_LOOPBACK)?"yes":"no");<br>
š hadapter = pcap_open_live(d-&gt;name, 0, 0, 0, 0);<br>
š if(getmac(hadapter, pMAC)){<br>
ššš printf("\tMAC Address: %s\n", pMAC);<br>
š }<br>
š pcap_close(hadapter);<br>
š for(a=d-&gt;addresses;a;a=a-&gt;next) {<br>
ššš printf("\tAddress Family: #%d\n",a-&gt;addr-&gt;sa_family);<br>
š <br>
ššš switch(a-&gt;addr-&gt;sa_family)<br>
ššš {<br>
ššššš case AF_INET:<br>
ššššššš printf("\tAddress Family Name: AF_INET\n");<br>
ššššššš if (a-&gt;addr)<br>
ššššššššš printf("\tAddress: %s\n",iptos(((struct sockaddr_in
*)a-&gt;addr)-&gt;sin_addr.s_addr));<br>
ššššššš if (a-&gt;netmask)<br>
ššššššššš printf("\tNetmask: %s\n",iptos(((struct sockaddr_in
*)a-&gt;netmask)-&gt;sin_addr.s_addr));<br>
ššššššš if (a-&gt;broadaddr)<br>
ššššššššš printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in
*)a-&gt;broadaddr)-&gt;sin_addr.s_addr));<br>
ššššššš if (a-&gt;dstaddr)<br>
ššššššššš printf("\tDestination Address: %s\n",iptos(((struct
sockaddr_in *)a-&gt;dstaddr)-&gt;sin_addr.s_addr));<br>
ššššššš break;<br>
ššššš default:<br>
ššššššš printf("\tAddress Family Name: Unknown\n");<br>
ššššššš break;<br>
ššš }<br>
š }<br>
š printf("\n");<br>
}<br>
<br>
#define IPTOSBUFFERSššš 12<br>
char *iptos(u_long in)<br>
{<br>
ššš static char output[IPTOSBUFFERS][3*4+3+1];<br>
ššš static short which;<br>
ššš u_char *p;<br>
<br>
ššš p = (u_char *)&amp;in;<br>
ššš which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);<br>
ššš sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);<br>
ššš return output[which];<br>
}<br>
int getmac(pcap_t* ha, char* pStr)<br>
{<br>
š PPACKET_OID_DATAššš pOidData;<br>
š CHAR pAddr[sizeof(PACKET_OID_DATA)+5];<br>
š ZeroMemory(pAddr, sizeof(PACKET_OID_DATA)+5);<br>
š pOidData = (PPACKET_OID_DATA) pAddr;<br>
š pOidData-&gt;Oid = OID_802_3_CURRENT_ADDRESS;<br>
š pOidData-&gt;Length = 6;<br>
š if(PacketRequest(ha-&gt;adapter, FALSE, pOidData))<br>
š {ššš <br>
ššššš sprintf(pStr, "%.02X:%.02X:%.02X:%.02X:%.02X:%.02X", <br>
ššššššššš
pOidData-&gt;Data[0],pOidData-&gt;Data[1],pOidData-&gt;Data[2],<br>
ššššššššš
pOidData-&gt;Data[3],pOidData-&gt;Data[4],pOidData-&gt;Data[5]);<br>
š }else{<br>
ššššš return 0;<br>
š }<br>
š return 1;<br>
}<br>
<br>
<hr size="2" width="100%"><b>#7 Using VB</b><br>
<br>
strComputer = "."<br>
'strComputer = "ΣΕΤΕΧΟΕ ΙΝΡ ΥΔΑΜΕΞΞΟΗΟ ΛΟΝΠΑ"<br>
Set objWMIService = GetObject(<a class="moz-txt-link-rfc2396E" href="winmgmts:\\">"winmgmts:\\"</a> &amp; strComputer &amp;
"\root\cimv2")<br>
Set IPConfigSet = objWMIService.ExecQuery _<br>
("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")<br>
For Each IPConfig in IPConfigSet<br>
If Not IsNull(IPConfig.IPAddress) Then<br>
For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)<br>
WScript.Echo IPConfig.IPAddress(i), IPConfig.Description(i)<br>
Next<br>
End If<br>
Next<br>
<br>
<hr size="2" width="100%"><br>
-- <br>
Best regards. Vasily Borovyak <a class="moz-txt-link-rfc2396E" href="mailto:vbor@isd.dp.ua">&lt;vbor@isd.dp.ua&gt;</a><br>
</body>
</html>