Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。 
   
  抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。可以如下示意: 
一旦创建 Socket,在客户端,你将可以通过Connect方法连接到指定的服务器,并通过Send/SendTo方法向远程服务器发送数据,而后可以通过Receive/ReceiveFrom从服务端接收数据;而在服务器端,你需要使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。使用完 Socket 后,记住使用 Shutdown 方法禁用 Socket,并使用 Close 方法关闭 Socket。其间用到的方法/函数有: 
   
  Socket.Connect方法:建立到远程设备的连接 
  public void Connect(EndPoint remoteEP)(有重载方法) 
  Socket.Send 方法:从数据中的指示位置开始将数据发送到连接的 Socket。 
  public int Send(byte[], int, SocketFlags);(有重载方法) 
  Socket.SendTo 方法 将数据发送到特定终结点。 
  public int SendTo(byte[], EndPoint);(有重载方法) 
  Socket.Receive方法:将数据从连接的 Socket 接收到接收缓冲区的特定位置。 
  public int Receive(byte[],int,SocketFlags); 
  Socket.ReceiveFrom方法:接收数据缓冲区中特定位置的数据并存储终结点。 
  public int ReceiveFrom(byte[], int, SocketFlags, ref EndPoint); 
  Socket.Bind 方法:使 Socket 与一个本地终结点相关联: 
  public void Bind( EndPoint localEP ); 
  Socket.Listen方法:将 Socket 置于侦听状态。 
  public void Listen( int backlog ); 
  Socket.Accept方法:创建新的 Socket 以处理传入的连接请求。 
  public Socket Accept(); 
  Socket.Shutdown方法:禁用某 Socket 上的发送和接收 
  public void Shutdown( SocketShutdown how ); 
  Socket.Close方法:强制 Socket 连接关闭 
  public void Close(); 
   
   
  可以看出,以上许多方法包含EndPoint类型的参数,在Internet中,TCP/IP 使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点,在 .NET 框架中正是由 EndPoint 类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的地址族定义了 EndPoint 的子代;对于 IP 地址族,该类为 IPEndPoint。IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint 类形成到服务的连接点。 
   
  用到IPEndPoint类的时候就不可避免地涉及到计算机IP地址,.Net中有两种类可以得到IP地址实例: 
   
  IPAddress类:IPAddress 类包含计算机在 IP 网络上的地址。其Parse方法可将 IP 地址字符串转换为 IPAddress 实例。下面的语句创建一个 IPAddress 实例: 
   
  IPAddress myIP = IPAddress.Parse("192.168.1.2"); 
   
   
  Dns 类:向使用 TCP/IP Internet 服务的应用程序提供域名服务。其Resolve 方法查询 DNS 服务器以将用户友好的域名(如"host.contoso.com")映射到数字形式的 Internet 地址(如 192.168.1.1)。Resolve方法 返回一个 IPHostEnty 实例,该实例包含所请求名称的地址和别名的列表。大多数情况下,可以使用 AddressList 数组中返回的第一个地址。下面的代码获取一个 IPAddress 实例,该实例包含服务器 host.contoso.com 的 IP 地址。 
   
  IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com"); 
  IPAddress ipAddress = ipHostInfo.AddressList[0]; 
   
   
  你也可以使用GetHostName方法得到IPHostEntry实例: 
   
  IPHosntEntry hostInfo=Dns.GetHostByName("host.contoso.com") 
   
   
  在使用以上方法时,你将可能需要处理以下几种异常: 
   
  SocketException异常:访问Socket时操作系统发生错误引发 
   
  ArgumentNullException异常:参数为空引用引发 
   
  ObjectDisposedException异常:Socket已经关闭引发 
   
  在掌握上面得知识后,下面的代码将该服务器主机( host.contoso.com的 IP 地址与端口号组合,以便为连接创建远程终结点: 
   
  IPEndPoint ipe = new IPEndPoint(ipAddress,11000); 
   
   
  确定了远程设备的地址并选择了用于连接的端口后,应用程序可以尝试建立与远程设备的连接。下面的示例使用现有的 IPEndPoint 实例与远程设备连接,并捕获可能引发的异常: 
   
  try { 
   s.Connect(ipe);//尝试连接 
  } 
  //处理参数为空引用异常 
   catch(ArgumentNullException ae) { 
   Console.WriteLine("ArgumentNullException : {0}", ae.ToString()); 
  } 
  //处理操作系统异常 
   catch(SocketException se) { 
   Console.WriteLine("SocketException : {0}", se.ToString()); 
  } 
   catch(Exception e) { 
   Console.WriteLine("Unexpected exception : {0}", e.ToString()); 
  }