风满袖
博客园
首页
博问
闪存
新随笔
联系
订阅
管理
随笔-71 文章-7 评论-399
Windows上获得IP地址的四种方法
最近在看网络编程(主要是TCP/IP通信的)的内容,还研究了下WMI。把获得IP地址的方法总结如下。
1. 使用ipconfig程序。
在命令行下使用命令ipconfig可以得到本机的每个有效网罗接口的IP网絡信息。如果在代码中,可以使用Process.Start()方法来调用ipconfig,然后使用正则表达式来解析结果──当然这样做太繁了,不实用。但我曾经使用类似的方法在代码中
获得MAC地址
。
2. 查找注册表。
使用注册表的麻烦之处在于各个版本的Windows在不同的地方存放网絡信息。
Windows98&Windows Me
注册表中的位置为:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Class\NetTrans
在这下面,每个Key对应一个网络设备的信息(IPAddress,DefaultGateway,IPMask)。
Windows NT
,
Windows 2000&Windows XP
和Windows98,Me不同,先要得知有哪些网卡,然后再查此网卡的网絡信息。第一步:找到网卡,地址为:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards,从中得到ServiceName值;
第二步:根据上面得到的ServiceName值到下面地址查找:
HKEY_LOCAL_MACHINE\CurrentControlSet\Services,找到响应的Key后,在parameters\tcpip下可以得到网络设备的信息(IPAddress,DefaultGateway,IPMask)。另外,对于动态的IP地址,可能得去查找DHCPIPAddress注册表對應关键词的值。
3. 使用WMI。
查询表Win32_NetworkAdapterConfiguration即可获得。
4. 使用DNS。
代码如下:
using
System;
using
Microsoft.Win32;
using
System.Management;
using
System.Net;
namespace
IPAddress
{
class
MainClass
{
/**/
///
<summary>
///
應用程式的主進入點。
///
</summary>
[STAThread]
static
void
Main(
string
[] args)
{
GetIPByRegistry();
GetIPByWMI();
GetIPByDns();
Console.ReadLine();
}
Methods
#region
Methods
private
const
string
CARDKEY
=
@"
SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards
"
;
private
const
string
SERVICEKEY
=
@"
SYSTEM\CurrentControlSet\Services\
"
;
public
static
void
GetIPByRegistry()
{
RegistryKey entry
=
Registry.LocalMachine;
RegistryKey services
=
entry.OpenSubKey(CARDKEY);
if
( services
==
null
)
return
;
string
[] cards
=
services.GetSubKeyNames();
services.Close();
foreach
(
string
key
in
cards )
{
RegistryKey cardService
=
entry.OpenSubKey(CARDKEY
+
"
\\
"
+
key);
if
( cardService
==
null
)
return
;
string
serviceName
=
cardService.GetValue(
"
ServiceName
"
).ToString();
Console.WriteLine(
"
\n Network card : {0}
"
,serviceName);
RegistryKey networkCard
=
entry.OpenSubKey(SERVICEKEY
+
serviceName
+
"
\\Parameters\\Tcpip
"
);
if
( networkCard
!=
null
)
{
string
[] ips
=
(
string
[]) networkCard.GetValue(
"
IPAddress
"
);
foreach
(
string
ip
in
ips)
{
Console.WriteLine(
"
The IPAddress is :{0}
"
,ip);
}
networkCard.Close();
}
entry.Close();
}
}
public
static
void
GetIPByWMI()
{
string
query
=
"
select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled='TRUE'
"
;
ManagementObjectSearcher searcher
=
new
ManagementObjectSearcher(query);
ManagementObjectCollection collection
=
searcher.Get();
foreach
( ManagementObject mo
in
collection )
{
string
[] ips
=
(
string
[])mo[
"
IPAddress
"
];
foreach
(
string
ip
in
ips )
{
Console.WriteLine(
"
Network card ip is :{0}
"
,ip);
}
}
}
public
static
void
GetIPByDns()
{
System.Net.IPAddress[] ips
=
Dns.GetHostByName(Dns.GetHostName()).AddressList;
foreach
( System.Net.IPAddress ip
in
ips )
{
Console.WriteLine(
"
The ip is : {0}
"
,ip.ToString());
}
}
#endregion
}
}
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted @ 2005-06-15 11:27
风满袖
阅读(6238)
评论(8)
编辑
收藏
发表评论
175972
回复
引用
#1楼
2005-06-15 15:21
网际浪子
提几个问题:
1、用注册表时如果一台机器有多个网卡,或安装后将网卡换过插槽,那键值找的就不对了。
2、用WMI,没有插网线的时候好像也不行。
回复
引用
查看
#2楼
[
楼主
]
2005-06-15 15:29
James
@网际浪子:
其實都不是完全之策.使用dns的話,如果dns服務沒有啟動,則也不能得到ip地址.
1.註冊表是存在這個問題.
2.沒有試過,如果連結的是本機的話,應該是沒有問題的.
回复
引用
查看
#3楼
[
楼主
]
2005-06-15 15:32
James
剛實驗了下子,没有插网线的时候,我連結本機WMI是正常的
回复
引用
#4楼
2005-06-16 12:42
li-new
也可以用Socket.LocalEndPoint属性
回复
引用
查看
#5楼
[
楼主
]
2005-06-16 12:57
James
@li-new :
你錯了.這個屬性是在你進行了Socket.Bind()才有值的.
怎麼能用這個來取呢!
回复
引用
#6楼
2005-06-16 16:11
li-new
你可以测试以下,当你new一个Socket后就可以用它的LocalEndPoint来取得本地的IP地址以及随即大于1024的端口!
回复
引用
查看
#7楼
[
楼主
]
2005-06-16 18:02
James
msdn :
LocalEndPoint 屬性通常會在您呼叫 Bind 方法之後才加以設定。如果您允許系統指派通訊端的本機 IP 位址和連接埠編號,則 LocalEndPoint 屬性將會在第一個 I/O 作業之後被設定。對連接導向通訊協定來說,第一個 I/O 作業將會是對 Connect 或 Accept 方法的呼叫。
回复
引用
#8楼
2005-06-17 09:49
adoer
不错,很实用的文章
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
苹果征集iPad 3发布会演示应用 重点是图形应用
·
京东商城涉足汽车销售 将上线售车频道
·
亚马逊新广告挑衅苹果:一个iPad可买三台kindle
·
动视暴雪确认今年第二季度推出《暗黑破坏神3》
·
官方承认 Google Bar 逆行倒施
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
公告
昵称:
风满袖
园龄:
7年1个月
粉丝:
6
关注:
0
<
2005年6月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
沟通
(1)
随笔分类
AJAX(4)
(rss)
Apache(2)
(rss)
BI(4)
(rss)
C#(11)
(rss)
C/C++(1)
(rss)
Database(7)
(rss)
Design(11)
(rss)
Java(1)
(rss)
O/R Mapping(10)
(rss)
SE/PM(11)
(rss)
Security(5)
(rss)
SOA(1)
(rss)
Software(4)
(rss)
Unix/Linux(1)
(rss)
随笔档案
2009年7月 (1)
2009年6月 (1)
2007年9月 (1)
2007年8月 (1)
2007年7月 (1)
2007年3月 (1)
2007年2月 (1)
2006年9月 (2)
2006年7月 (5)
2006年6月 (9)
2006年5月 (3)
2006年4月 (7)
2006年3月 (1)
2006年1月 (1)
2005年10月 (1)
2005年9月 (5)
2005年8月 (4)
2005年7月 (5)
2005年6月 (3)
2005年5月 (1)
2005年4月 (3)
2005年3月 (2)
2005年2月 (3)
2005年1月 (9)
文章分类
Design(6)
(rss)
Programming(2)
(rss)
积分与排名
积分 - 238672
排名 - 333
最新评论
阅读排行榜
评论排行榜
推荐排行榜