IP地址与端口
System.Net命名空间:
IPAddress类:提供了对IP地址的转换、处理等功能;
17个普通方法
Dns类:该类提供了一系列静态的方法,用于获取提供本地或远程域名等功能;
4个异步;
8个普通方法;
得到主机名: string HostName = Dns.GetHostName();
得到主机IP: IPAddress[] IPList = Dns.GetHostAdderss(HostName);
IPHostEntry类:该类的实例对象包含了Internet主机的相关信息,常用属性有两个:一个是AddressList属性,另一个是HostName属性;
IPEndPoint类:在Internet中,TCP/IP使用一个网络地址和一个服务端口号来唯一标志标识设备和服务。网络地址标识网络上的设备;端口号标识该设备上的特定服务。网络地址和服务端口的组合称为端点。在C#中,使用IPEndPoint类表示这个端点,该类包含了应用程序连接到主机上的服务所需的IP地址和端口信息;
套接字:(流套接字和数据报套接字)
互联网进行通信,至少需要一对套接字,其中一个运行于客户端(ClientSocket),另一个运行于服务端(ServerSocket)。
套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
使用套接字处理数据有两种基本模式:同步套接字和异步套接字。
1. 同步套接字
同步套接字的特点是在通过Socket进行连接、接收、发送操作时,客户机或服务器在接收到对方响应前会处于阻塞状态,即一直等到接收到对方请求时才继续执行下面的语句。可见,同步套接字适用于数据处理不太多的场合。当程序执行的任务很多时,长时间的等待可能会让用户无法忍受。
2. 异步套接字
在通过Socket进行连接、接收、发送操作时,客户机或服务器不会处于阻塞方式,而是利用callback机制进行连接、接收和发送处理,这样就可以在调用发送或接收的方法后直接返回,并继续执行下面的程序。可见,异步套接字特别适用于进行大量数据处理的场合。
Socket类:
System.Net.Sockets命名空间
表1-1 IP套接字定义组合
SocketType | ProtocolType | 说明 |
Dgram | Udp | 无连接通信 |
Stream | Tcp | 面向连接的通信 |
Raw | Icmp | Internet控制报文协议 |
Raw | Raw | 简单IP包通信 |
表1-3 套接字常用选项值
SocketOptionLevel | SocketOptionName | 说明 |
IP | AddMembership | 增加一个IP组成员 |
IP | HeaderIncluded | 指出发送到套接字的数据将包括IP头 |
IP | IPOptions | 指定IP选项插入到输出的数据包中 |
IP | MulticastInterface | 设置组播包使用的接口 |
IP | MultiLoopBack | IP组播回送 |
IP | PacketInformation | 返回关于接收包的信息 |
IP | UnBlockSource | 设置套接字为无阻塞模式 |
Socket | AcceptConnection | 如果为真,表明套接字正在侦听 |
Socket | Broadcast | 如果为真,表明允许在套接字上发送广播消息 |
Socket | MaxConnections | 设置使用的最大队列长度 |
Socket | PacketInformation | 返回接收到的套接字信息 |
Socket | ReceiveBuffer | 接收套接字的缓存大小 |
Socket | ReceiveTimeout | 接收套接字的超时时间 |
Socket | SendBuffer | 发送套接字的缓存大小 |
Socket | SendTimeout | 发送套接字的超时时间 |
Socket | Type | 获取套接字的类型 |
Socket | UseLookback | 使用回传 |
Tcp | NoDelay | 为发送合并禁用 Nagle 算法 |
Udp | ChecksumConverage | 设置或获取 UDP 校验和覆盖 |
Udp | NoChecksum | 发送校验和设置为零的 UDP 数据报 |
要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
1、服务器监听是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
2、客户端请求是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后再向服务器端套接字提出连接请求。
3、连接确认是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的信息发给客户端,一旦客户端确认了此信息,连接即可建立。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
编程时必须要考虑消息边界问题
解决TCP协议消息边界问题的方法有三种:
C:\Windows\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:"C:\Program Files\Reference A