编译:Northtibet 下载源代码(zip压缩文件, 1K) 对于这个古老的问题,VC知识库的精华区以及以往的在线杂志中都有详尽不一的描述。本文提供的方法是一个比较完整的解决方案,并附有详细的实现细节。希望大家对这个问题有彻底的认识。其实,如果你熟悉 Windows 的Sockets API,并了解一些底层的Winsock知识。那么要获得某台机器的IP地址并不是什么难事。一台机器可以装多块网卡,因此它就可能有多个IP地址。目前很多发烧友的PC机都装有多块网卡。其中一块网卡与调制解调器(MODEM)或者ADSL适配器相连,另一块与家里的局域网(LAN)相连。对于有宽带连接条件的家庭,这更是一种典型的配置。任何事情,一旦你知道了解决的方法,一切都会变得如此简单。下面是本文提供的一个简单的控制台程序(程序名为getip1),其功能就是显示本机的IP地址。如图一所示: 
图一 getip1的运行画面 下面是 getip1 程序的代码,很简单:
//////////////////////////////////////////////////////////////// // getip1.cpp // // 本程序报告本机上每一块网卡的IP地址 // 命令行编译命令为: // // cl getip1.cpp wsock32.lib // // 请一定要在环境变量中正确指定LIB库的路径;可以运行vcvars32.bat // #include <winsock.h> #include <wsipx.h> #include <wsnwlink.h> #include <stdio.h>
int main() { //////////////// // 初始化 Windows sockets API. 要求版本为 version 1.1 // WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData; if (WSAStartup(wVersionRequested, &wsaData)) { printf("WSAStartup failed %s\n", WSAGetLastError()); return -1; }
////////////////// // 获得主机名. // char hostname[256]; int res = gethostname(hostname, sizeof(hostname)); if (res != 0) { printf("Error: %u\n", WSAGetLastError()); return -1; } printf("hostname=%s\n", hostname); //////////////// // 根据主机名获取主机信息. // hostent* pHostent = gethostbyname(hostname); if (pHostent==NULL) { printf("Error: %u\n", WSAGetLastError()); return -1; } ////////////////// // 解析返回的hostent信息. // hostent& he = *pHostent; printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n", he.h_name, he.h_aliases, he.h_addrtype, he.h_length);
sockaddr_in sa; for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) { memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length); // 输出机器的IP地址. printf("Address: %s\n", inet_ntoa(sa.sin_addr)); // 显示地址串 } ////////////////// // 终止 Windows sockets API // WSACleanup(); return 0; }
|