edog

冰冻热狗
数据加载中……

取本机IP地址和网卡号

界面如下,主要是使用Winsock的一些东东取机器名和IP地址,取网卡就麻烦些,需要发送Netbios命令,需要注意的是需要包含winsock2.hnb30.h,并且要引入两个lib
GetIPName.jpg

包含头和lib如下:
#include<winsock2.h>
#include 
<nb30.h>
#pragma comment(lib, 
"netapi32.lib")
#pragma comment(lib, 
"Wsock32.lib")

具体的实现参考源程序。

源程序下载:http://www.cppblog.com/Files/edog/GetIPName.rar


根据shootingstars 的指点,编写了一下用 Iphlpapi 取IP地址的代码,可以取本机IP,网关IP,子网掩码,网卡名字等,需要在VC7上编译:

#include "stdio.h" 
#include 
"windows.h" 
#include 
"Iphlpapi.h" 
#pragma comment(lib, 
"Iphlpapi.lib"
void main() 

IP_ADAPTER_INFO pAdapterInfo; 
ULONG len 
= sizeof(pAdapterInfo); 

if(GetAdaptersInfo(&pAdapterInfo, &len) != ERROR_SUCCESS) 

printf(
"GetAdaptersInfo ERROR!\n"); 
}
 
else 

printf(
"AdapterName: %s\n", pAdapterInfo.AdapterName); 
printf(
"Description: %s\n", pAdapterInfo.Description); 
printf(
"IP Address : %s\n", pAdapterInfo.IpAddressList.IpAddress.String); 
printf(
"IP Mask : %s\n", pAdapterInfo.IpAddressList.IpMask.String); 
printf(
"Gateway IP : %s\n", pAdapterInfo.GatewayList.IpAddress.String); 
}
 
}
 

输出结果如下: 
AdapterName: 
{475CB3CA-3478-415A-86D8-7E5982306F58} 
Description: D
-Link DFE-530TX PCI Fast Ethernet Adapter (rev.C) 
IP Address : 
192.168.168.23 
IP Mask : 
255.255.255.0 
Gateway IP : 
192.168.168.10 

posted on 2005-11-30 01:13 冰冻热狗 阅读(13096) 评论(15)  编辑 收藏 引用 所属分类: 应用程序

评论

# re: 取本机IP地址和网卡号  回复  更多评论   

也可以包含windows.h,附加库ws2_32.lib即可提取IP地址和Hostname
2005-11-30 06:42 | nanami

# re: 取本机IP地址和网卡号  回复  更多评论   

呵呵,不用这么麻烦,直接使用ip助手库提供的函数即可:
DWORD GetAdaptersInfo(
PIP_ADAPTER_INFO pAdapterInfo,
PULONG pOutBufLen
);
其中IP_ADAPTER_INFO结构体包含所有的网卡描述信息
2005-11-30 09:58 | shootingstars

# re: 取本机IP地址和网卡号  回复  更多评论   

谢谢 shootingstars 的指点,我试了一下GetAdaptersInfo,功能更好,可以取到本机IP,子网掩码,网关IP,网卡名称等。不过只能在VC7上编译,VC6好像不支持IP Helper库,另外,不知道能否用这个库取到MAC地址?还没来得及研究呢,请指点一二:) 程序如下:

#include "stdio.h"
#include "windows.h"
#include "Iphlpapi.h"
#pragma comment(lib, "Iphlpapi.lib")
void main()
{
IP_ADAPTER_INFO pAdapterInfo;
ULONG len = sizeof(pAdapterInfo);

if(GetAdaptersInfo(&pAdapterInfo, &len) != ERROR_SUCCESS)
{
printf("GetAdaptersInfo ERROR!\n");
}
else
{
printf("AdapterName: %s\n", pAdapterInfo.AdapterName);
printf("Description: %s\n", pAdapterInfo.Description);
printf("IP Address : %s\n", pAdapterInfo.IpAddressList.IpAddress.String);
printf("IP Mask : %s\n", pAdapterInfo.IpAddressList.IpMask.String);
printf("Gateway IP : %s\n", pAdapterInfo.GatewayList.IpAddress.String);
}
}

输出结果如下:
AdapterName: {475CB3CA-3478-415A-86D8-7E5982306F58}
Description: D-Link DFE-530TX PCI Fast Ethernet Adapter (rev.C)
IP Address : 192.168.168.23
IP Mask : 255.255.255.0
Gateway IP : 192.168.168.10
2005-11-30 14:14 | 冰冻热狗

# re: 取本机IP地址和网卡号  回复  更多评论   

Good
2006-01-19 15:58 | Kevin Lai

# re: 取本机IP地址和网卡号  回复  更多评论   

好东东,...
2006-03-17 18:43 |

# re: 取本机IP地址和网卡号  回复  更多评论   

good
2006-04-11 21:12 | g

# re: 取本机IP地址和网卡号  回复  更多评论   

pAdapterInfo.Address就是MAC地址
2006-09-19 15:51 | fnst

# re: 取本机IP地址和网卡号  回复  更多评论   

ULONG len = sizeof(pAdapterInfo);
若有多个IP会产生ERROR_BUFFER_OVERFLOW错误
改成*10应该好些
2006-09-19 17:36 | fnst

# re: 取本机IP地址和网卡号  回复  更多评论   

哈,谢谢各位指点!
2006-09-20 23:31 | 冰冻热狗

# re: 取本机IP地址和网卡号  回复  更多评论   

GetAdaptersInfo在VC6下需要安装platformSDK,因为它自己不含Iphlpapi.h,在SDK里包含了,可以去微软网站下载
2006-11-17 08:48 | haipengno1

# re: 取本机IP地址和网卡号  回复  更多评论   

你好,我看过了你的用Netbios命令去MAC地址的源代码,但我想知道,如何区分是虚拟网卡,还是真的网卡呢?
2006-11-22 15:00 | yingyi8989

# re: 取本机IP地址和网卡号  回复  更多评论   

利用NetBios取出来的虚拟网卡MAC地址为零,你取一取就知道了
2007-05-31 22:29 | naliver

# re: 取本机IP地址和网卡号  回复  更多评论   

太好了,我爱死你了!
2007-07-12 10:10 | suwh

# 错了?[未登录]  回复  更多评论   

利用NetBios取出来的虚拟网卡MAC地址为零,你取一取就知道了
=============================================
说错了吧? 我用VM,Netbios取出来的不是0啊
2008-01-10 15:02 | hw

# re: 取本机IP地址和网卡号  回复  更多评论   

tks 4 your help
2008-01-25 14:23 | hss

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理