IPEndPoint类:在Internet中,TCP/IP使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点,在.NET框架中正是由EndPoint类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的地址族定义了 EndPoint的子代;对于IP地址族,该类为IPEndPoint。IPEndPoint类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint类形成到服务的连接点。
在IPEndPoint类中有两个很有用的构造函数: public IPEndPoint( long , int ); public IPEndPoint(IPAddress, int );
IPHostEntry IPHost = Dns.Resolve( " www.google.com " ); IPAddress[] addr = IPHost.AddressList; IPEndPoint ep = new IPEndPoint(addr[ 0 ], 80 );
Socket类:Socket类是包含在System.Net.Sockets名字空间中的一个非常重要的类。一个Socket实例包含了一个本地以及一个远程的终结点,就像上面介绍的那样,该终结点包含了该Socket实例的一些相关信息。
需要知道的是Socket 类支持两种基本模式:同步和异步。其区别在于:在同步模式中,对执行网络操作的函数(如Send和Receive)的调用一直等到操作完成后才将控制返回给调用程序。在异步模式中,这些调用立即返回。下面我们重点讨论同步模式的Socket编程。首先,同步模式的Socket编程的基本过程如下:1. 创建一个Socket实例对象。2. 将上述实例对象连接到一个具体的终结点(EndPoint)。3. 连接完毕,就可以和服务器进行通讯:接收并发送信息。4. 通讯完毕,用ShutDown()方法来禁用Socket。5. 最后用Close()方法来关闭Socket。知道了以上基本过程,我们就开始进一步实现连接并通讯了。在使用之前,你需要首先创建Socket对象的实例,这可以通过Socket类的构造方法来实现: public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);
在创建了Socket实例后,我们就可以通过一个远程主机的终结点和它取得连接,运用的方法就是Connect()方法:
public Connect (EndPoint ep);
IPHostEntry IPHost = Dns.Resolve( " http://www.google.com/ " ); string []aliases = IPHost.Aliases; IPAddress[] addr = IPHost.AddressList;EndPoint ep = new IPEndPoint(addr[ 0 ], 80 ); Socket sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);sock.Connect(ep); if (sock.Connected)Console.WriteLine( " OK " );
一旦连接成功,我们就可以运用Send()和Receive()方法来进行通讯。
Send()方法的函数原型如下: public int Send ( byte [] buffer, int size, SocketFlags flags);
SocketFlags.None、SocketFlags.DontRoute、SocketFlags.OutOfBnd。
该方法返回的是一个System.Int32类型的值,它表明了已发送数据的大小。同时,该方法还有以下几种已被重载了的函数实现:
public int Send ( byte [] buffer); public int Send ( byte [] buffer, SocketFlags flags); public int Send ( byte [] buffer, int offset, int size, SocketFlags flags);
public int Receive( byte [] buffer, int size, SocketFlags flags);
public int Receive ( byte [] buffer); public int Receive ( byte [] buffer, SocketFlags flags); public int Receive ( byte [] buffer, int offset, int size, SocketFlags flags);
public void ShutDown(SocketShutdown how);
public void Close();
protected virtual void Dispose( bool disposing);