在看下面的代码之前,你必须对网间进程通信这一概念有大概的了解。网间进程通信,主要解决的是不同主机进程间的相互通信及多重协议的识别问题。同一主机上不同进程可用进程号唯一标识,但在网络环境下,各主机独立分配的进程号不能唯一标识该进程,例如,主机A中有1011号进程,在B机中也存在该号进程,操作系统支持的网络协议很多,不同协议的工作方式、地址格式也不相同。为了解决上述问题,TCP/IP协议引入了端口、地址、网络字节顺序等概念,这里并不做详细介绍。
在TCP/IP网络应用中,通信的两个进程间相互通信的主要模式是客户/服务器模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务,客户/服务器模式通信过程中采取的是主动请求方式,首先服务器方要先启动,并根据请求提供相应服务:
1>. 打开一通信通道并告知本地主机,它愿意在某一公认地址上接收客户请求。
2>. 等待客户请求到达该端口。
3>. 接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求。新进程处理此客户请 求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。
4>. 返回第二步,等待另一客户请求。
5>. 关闭服务器
客户方:
1>. 打开一通信通道,并连接到服务器所在主机的特定端口。
2>. 向服务器发服务请求报文,等待并接收应答;继续提出请求。
3>. 请求结束后关闭通信通道并终止。
TCP/IP的socket提供下列三种类型套接字,下面的例子只介绍到前两种类型:
1>:流式套接字(stream)
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(ftp)即使用流式套接字。
2>:数据报式套接字(dgram)
提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。
3>:原始式套接字(raw)
该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备.
1:TCP、UDP同步操作模式:
1>:如果当前使用的是面向连接的协议(如 TCP),则服务器可以使用 Listen 方法侦听连接。Accept 方法处理任何传入的连接请求,并返回可用于与远程主机进行数据通信的 Socket。可以使用此返回的 Socket 来调用 Send 或 Receive 方法。如果要指定本地 IP 地址和端口号,请在调用 Listen 方法之前先调用 Bind 方法。如果您希望基础服务提供程序为您分配可用端口,请使用端口号 0。如果希望连接到侦听主机,请调用 Connect 方法。若要进行数据通信,请调用 Send 或 Receive 方法。
2>:如果当前使用的是无连接协议(如 UDP),则根本不需要侦听连接。调用 ReceiveFrom 方法可接受任何传入的数据报。使用 SendTo 方法可将数据报发送到远程主机。
2:TCP、UDP异步操作模式:
1>:如果当前使用的是面向连接的协议(如 TCP),则可使用 Socket、BeginConnect 和 EndConnect 方法来连接侦听主机。通过使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以进行异步数据通信。可以使用 BeginAccept 和 EndAccept 处理传入的连接请求。
2>:如果您使用的是 UDP 等无连接协议,则可以使用 BeginSendTo 和 EndSendTo 来发送数据报,而使用 BeginReceiveFrom 和 EndReceiveFrom 来接收数据报。