c#网络编程 002 (网络编程相关类)

2008年12月28日星期日

c#网络编程 002 (网络编程相关类)

一、IPAddress类

该类对象用于表示一个IP地址,默认构造函数如下所示:

public IPAddress(long address)


公共方法:(public)

Equals 比较两个IP地址。

GetAddressByte 以字节数组形式提供IPAddress的副本。

GetHashCode 已重写,返回IP地址的哈希值。

GetType 获取当前实例的Type。

HostToNetworkOrder 将值由主机字节顺序转换为网络字节顺序。

IsLoopBack 指示指定的IP地址是否是返回地址。

NetworkToHostOrder 将数字由网络字节顺序转换为主机字节顺序。

Parse 将IP地址字符串转换为IPAddress实例

ReferenceEquals 确定指定的Object实例是否是相同的实例。

ToString 将Internet地址转换为标准表示法。

TryParse 确定字符串是否为有效的IP地址。

其中Prase方法最常用于创建IPAddress实例,其语法如下:

public static IPAdress Parse(string ipString)

参数ipString包含IP地址(IPv4使用点分隔的四部分表示法,IPv6使用冒号十六进制表示法)的字符串,返回一个IPAddress的实例,例如:

public NewAddress= IPAddress.parse("192.168.0.1");

另一个常用的是ToString()方法,用于将Internet地址转换成标准表示法。其语法如下:

public override string ToString()

返回值包含该IP地址的字符串。(IPv4使用点分隔的四部分表示法,IPv6使用冒号十六进制表示法)

保护方法:(protected)

Finalize 允许Object在“垃圾回收”Object之前尝试释放资源并执行其他清理操作。

MemberwiseClone 创建当前Object的浅表副本。


只读公共字段:

Any 提供一个IP地址,指示服务器应侦听所有网络连接上的客户端活动。

Broadcast 提供IP广播地址。

IPv6Any 指示Socket必须侦听所有网络接口上的客户端活动。

IPv6Loopback 提供IP返回地址。

IPv6None 提供指示不应使用任何网络接口的IP地址。

Loopback 提供IP返回地址。

None 供指示不应使用任何网络接口的IP地址。

例子:

using System;
using System.Net;

namespace Sq.Wl.Bc
{
public class Test1
{
public static int Main()
{
string address=IPAddress.None.ToString();
Console.WriteLine("IP address:"+address);
return 0;
}
}
}

输出结果:

IP address:255.255.255.255

下面的程序帮助理解本节内容:

using System;
using System.Net;

namespace S.Q.S
{
public class IPAddressSample
{
public static void Main()
{
//
IPAddress newaddress1=IPAddress.Parse("192.168.1.1");
IPAddress newaddress2=IPAddress.Loopback;
IPAddress newaddress3=IPAddress.Broadcast;
IPAddress newaddress4=IPAddress.Any;
IPAddress newaddress5=IPAddress.None;
//
IPHostEntry here=Dns.GetHostEntry(Dns.GetHostName());
IPAddress localaddress=here.AddressList[0];
//
if (IPAddress.IsLoopback(newaddress2))
{
Console.WriteLine("The Loopback address is :{0}",newaddress2.ToString());
}
else
{
Console.WriteLine("Error obtaining the loopback address");
}
Console.WriteLine("The Local IP address is :{0}",localaddress.ToString());
if (localaddress==newaddress2)
{
Console.WriteLine("The loopback address is the same as local address.");
}
else
{
Console.WriteLine("The loopback address is not the local address.");
}
Console.WriteLine("The test address is :{0}",newaddress1.ToString());
Console.WriteLine("Broadcast address is :{0}",newaddress3.ToString());
Console.WriteLine("The ANY address is :{0}",newaddress4.ToString());
Console.WriteLine("The NONE address is :{0}",newaddress5.ToString());
return;
}
}
}

输出结果:

D:\c#wangluo>ipaddresssample
The Loopback address is :127.0.0.1
The Local IP address is :192.168.0.223
The loopback address is not the local address.
The test address is :192.168.1.1
Broadcast address is :255.255.255.255
The ANY address is :0.0.0.0
The NONE address is :255.255.255.255


公共属性:

Address 网际协议地址(IP地址)

AddressFamily 获取IP地址的地址族

IsIPv6LinkLocal 获取地址是否为IPv6链接本地地址

IsIPv6Multicast 获取地址是否为IPv6多路广播全局地址

IsIPv6SiteLocal 获取地址是否为IPv6站点本地地址

ScopeId 获取或设置IPv6地址范围标识符

Address的属性值是IP地址的长值。他的语法引用如下:

public long Address{get;set;}

AddressFamily 的属性值对应IPv4,返回InterNetwork,对于IPv6,返回InterNetworkV6,它的语法引用如下:

public AddressFamily AddressFamily{get;}

ScopeId的属性值为指定地址范围的长整数。它的语法引用如下:

public long ScopeId{get;set;}

二、DNS类。

提供简单的域名解析功能。

公共方法 从功能上分为同步和异步方法:

同步方法:

GetHostName() 获取本地计算机的主机名。

GetHostByName() 获取指定DNS主机名的DNS信息,(现已过期,被GetHostEntry取代)

GetHostByAddress() 获取IP地址的DNS主机信息。

Resolve() 将DNS主机名或IP地址解析为IPHostEntry实例。

异步方法:

BeginGetHostByName 开始异步请求关于指定DNS主机名的IPHostEntry信息

BeginREsolve 开始异步请求将DNS主机名或IP地址解析为IPAddress实例

EndGetHostByName 通过主机名结束对DNS信息的异步请求。

EndResolve 通过远程主机信息结束对DNS信息的异步请求。

异步方法能减少网络阻塞。

三、IPHostEntry类

为Internet主机地址信息提供容器类。IPHostEntry类将一个域名系统DNS主机名与一组别名和一组匹配的IP地址关联。例如:在DNS数据库中查询关于主机www.163.com的信息,并在IPHostEntry实例中返回信息。代码如下:

IPHostEntry hostInfo=Dns.GetHostByName("www.163.com");

hostInfo包含三个属性 :

AddressList 获取或设置与主机关联的IP地址列表。

Aliases 获取或设置与主机关联的别名列表。

HostName 获取或设置主机的DNS名称。

例程:

using System;
using System.Net;

namespace S.Q.S
{
class IPHostEntryClassSample
{
public static void Main(string[] argv)
{
if (argv.Length !=1)
{
Console.WriteLine("Usage:GetDNSHostInfo hostname");
return;
}

IPHostEntry results=Dns.GetHostEntry(argv[0]);
Console.WriteLine("Host name:{0}",results.HostName);

foreach(string alias in results.Aliases)
{
Console.WriteLine("Alias:{0}",alias);
}
foreach(IPAddress address in results.AddressList)
{
Console.WriteLine("Address:{0}",address.ToString());
}
return;
}
}
}

输出结果:

Host name:www.cache.idns.yeah.net
Address:220.181.28.54
Address:220.181.28.212
Address:220.181.28.50
Address:220.181.28.52
Address:220.181.28.53

四、IPEndPoint类

将网络端点表示为IP地址和端口号,它的对象表示指定的IP地址和端口组合。

该类包含应用程序连接到主机上的服务所需的主机和本地或远程端口信息。

通过组合服务的主机IP地址和端口号,IPEndPoint类形成到服务器的连接点。有两个构造函数。

public IPEndPoint(long address,int port)

public IPEndPoint(IPAddress address,int port)

一般使用第二种

属性:

Address 得到或设置IP地址属性

AddressFamily 得到IP地址系列

Port 得到或设置端口号

字段:

MaxPort 端口最大值

MinPort 端口最小值

结合以下程序了解该类:

using System;
using System.Net;

namespace S.Q.S
{
class IPEndPointSample
{
public static void Main()
{
IPAddress NewAddress=IPAddress.Parse("192.168.1.1");
//
IPEndPoint Ex=new IPEndPoint(NewAddress,8000);

Console.WriteLine("The IPEndPoint is:{0}",Ex.ToString());
Console.WriteLine("The AddressFamily is:{0}",Ex.AddressFamily);
Console.WriteLine("The Address is:{0},and port is:{1}",Ex.Address,Ex.Point);
Console.WriteLine("The Min Port Number is :{0} ",IPEndPoint.MinPort);
Console.WriteLine("The Max Port Number is :{0} ",IPEndPoint.MaxPort);

Ex.Port=80;
Console.WriteLine("The Changed IPEndPoint is:{0}",Ex.ToString());
//
SocketAddress Sa=Ex.Serialize();
Console.WriteLine("The Socketaddress is :{0}",Sa.ToString());
}
}
}

输出结果为:

The IPEndPoint is:192.168.1.1:8000
The AddressFamily is:InterNetwork
The Address is:192.168.1.1,and port is:8000
The Min Port Number is :0
The Max Port Number is :65535
The Changed IPEndPoint is:192.168.1.1:80
The Socketaddress is :InterNetwork:16:{0,80,192,168,1,1,0,0,0,0,0,0,0,0}

这里使用了Socket类,这个类非常重要,在下一节中详细介绍,简单说明一下该类的格式:

1字节表示对象的大小2字节表示对象的端口号,其余字节表示对象的IP地址。

0 评论:

发表评论