00001 #include <windows.h>
00002 #include <winsock.h>
00003 #include <stdio.h>
00004
00005 #include <string.h>
00006 #include "ipaddr.h"
00007
00008 #define MAXHOSTNAME 256
00009
00010 static void IPAddr_AddrToString(unsigned long Addr, char *AddrBuff)
00011 {
00012 AddrBuff += sprintf(AddrBuff, "%d.", Addr & 0xff);
00013 Addr = Addr >> 8;
00014
00015 AddrBuff += sprintf(AddrBuff, "%d.", Addr & 0xff);
00016 Addr = Addr >> 8;
00017
00018 AddrBuff += sprintf(AddrBuff, "%d.", Addr & 0xff);
00019 Addr = Addr >> 8;
00020
00021 sprintf(AddrBuff, "%d", Addr & 0xff);
00022 }
00023
00024 #define WS_VERSION_REQD 0x0101
00025 #define WS_VERSION_MAJOR HIBYTE(WS_VERSION_REQD)
00026 #define WS_VERSION_MINOR LOBYTE(WS_VERSION_REQD)
00027
00028 int IPAddr_GetHostID (char *AddrBuff)
00029 {
00030 WSADATA wsaData;
00031 char HostName[MAXHOSTNAME];
00032 LPHOSTENT HostEnt;
00033 SOCKADDR_IN LocalAddress;
00034 SOCKADDR_IN RemoteAddress;
00035 SOCKET Socket;
00036 int Res;
00037 int i;
00038
00039 Res = WSAStartup(WS_VERSION_REQD,&wsaData);
00040 if (Res != 0)
00041 return 0;
00042
00043 if (( LOBYTE (wsaData.wVersion) < WS_VERSION_MAJOR) ||
00044 ( LOBYTE (wsaData.wVersion) == WS_VERSION_MAJOR &&
00045 HIBYTE (wsaData.wVersion) < WS_VERSION_MINOR))
00046 {
00047 return 0;
00048 }
00049
00050 LocalAddress.sin_addr.s_addr = INADDR_ANY;
00051
00052 Res = gethostname(HostName, sizeof(HostName));
00053 if (Res != SOCKET_ERROR)
00054 {
00055 HostEnt = gethostbyname(HostName);
00056 if (HostEnt)
00057 {
00058 IPAddr_AddrToString(*(unsigned long *)HostEnt->h_addr_list[0], AddrBuff);
00059 i = 0;
00060 while (HostEnt->h_addr_list[i])
00061 i++;
00062 return i;
00063 }
00064 }
00065
00066 Socket = socket(AF_INET, SOCK_DGRAM, 0);
00067 if (Socket != INVALID_SOCKET)
00068 {
00069 RemoteAddress.sin_family = AF_INET;
00070 RemoteAddress.sin_port = htons(IPPORT_ECHO);
00071 RemoteAddress.sin_addr.s_addr = inet_addr("199.1.90.2");
00072 Res = connect(Socket, (SOCKADDR *)&RemoteAddress, sizeof(SOCKADDR));
00073 if (Res != SOCKET_ERROR)
00074 {
00075 int AddrSize = sizeof(SOCKADDR);
00076
00077 getsockname(Socket, (LPSOCKADDR)&LocalAddress, (int *)&AddrSize);
00078
00079 IPAddr_AddrToString(LocalAddress.sin_addr.s_addr, AddrBuff);
00080
00081 return 1;
00082 }
00083
00084 closesocket(Socket);
00085 }
00086
00087 return 0;
00088 }
00089
00090 #if 0
00091 void main(void)
00092 {
00093 char Buff[16];
00094 int Count;
00095
00096 Count = IPAddr_GetHostID(Buff);
00097 printf("%d addrs\n", Count);
00098 printf("%s\n", Buff);
00099 }
00100 #endif
00101