Socket
Socket是Tcp/ip网络环境下应用程序与底层通信驱动程序之间运行的开发接口,他可以将应用程序与具体的Tcp/ip隔离开来,使得应用程序不需了解Tcp/ip的具体细节,就能实现数据传输。
Socket通信是基于客户端/服务器结构的客户端是发送数据的一方,而服务器则时刻准备这接受来自客户端的数据,并对客户端做出回应。下面是基于Tcp的两个网络应用程序进行通信的基本过程。
(1)客户端需要了解服务器的地址,在Tcp/ip网络环境中,可以使用IP地址来表示一个主机,但仅仅是一个IP是不够的
如果一台主机上运行了多个应用程序,那么如何确定那个应用程序通信呢?在Socket通信过程中借用了Tcp.Udp端口号,不同的应用和程序可以使用不同的端口进行通信,这样一个主机上就可以同时有多个应用程序进行网络通信了
(2)服务器应用程序必须早于客户端应用程序启动,并在指定的IP地址和端口上执行监听操作,如果该端口被其他应用程序所占用,在服务器应用程序无法正常启动,服务器处于监听状态类似于电话接听电话线,等待拨打的状态。
(3)客户端在申请发送数据时,服务器端应用程序必须有祖国的时间响应才能进行正常通信,否则就好像电话响了却无人接听,在通常情况下,服务器应用程序都需要具备同时处理多个客户端请求的能力,如果服务器应用程序涉及到不合理或客户端访问量过大,都有可能导致,无法及时响应客户端的情况。
(4)使用Socket协议进行通信的双方还必须使用相同的通信协议,Socket支持的底层通信协议包括TCP UDP两种
(5)在通信过程中,物理网络必须保持畅通否则通信将会中段
(6)通信结束后,服务器端和客户端应用程序都可以中断他们之间的链接。
2、Socket的服务方式和类型
Socket开发接口可以提供面向链接和无连接的两种服务方式。
在面向链接的服务方式中,每次完证的数据传输都要经过建立链接,使用链接和关闭连接的过程。链接相当于一个传输管理,因此在数据传输过程中,分组数据包中不需要指定目的地址。TCP提供面向链接的虚电路。基于面向链接服务方式的应用包括Telnet和FTP等。
在无连接服务方式中,每次数据传输并不需要建立连接,因此每个分组数据包中必须包括完整的目的地址,并且每隔数据包都独立的在网络中传输,无连接服务不能保证分组的先后顺序,不能保证数据传输的可靠性。UDP提供无连接的数据报服务。基于无连接服务的应用包括简单网络管理协议。
在Socket通信中,套接字分为3中类型,及流式套接字、数据报式套接字、原是套接字
(1)流式套接字
他提供面向链接的可靠的数据传输服务,可以无差错的发送数据。传输数据可以是双向的字节流,即应用程序采用全双工方式,通过套接字同时传输和接收数据。应用程序可以通过流传递有序的不重复的数据。所谓有序的指数据包按发送顺序送达目的地,不重复指一个特定的数据包只能获取一次。。如果必须保证数据能够可靠的传送目的地并且数据量很大时可以采用流式套接字传输数据。
(2)数据报式套接字
他提供无连接的数据传输服务,数据包被独立的发送,数据可能丢失或重复。
(3)原是套接字
他是公开的Socket编程接口,使用他可以在IP层上对Socket进行编程发送和结束IP层上的原始数据包。
3、面向链接的Socket通信流程
(1)服务器
*建立流式套接字,返回套接字号
*套接字,与本地地址绑定
*通知TCP服务器准备好接收链接
*等待客户端的链接
*建立连接,得到新的套接字比如ns
*在套接字ns上读写数据,直接结束
*关闭套接字
*关闭最初的套接字结束服务
(2)客户端
*建立流式套接字返回套接字号
*将套接字与远程主机链接
*在套接字上读写数据直接结束
*关闭套接字结束会话
服务器程序要先于客户机程序启动。
4、面向非连接的Socket通信流程
(1)服务器端
*建立流式套接字,返回套接字号
*套接字S与本地地址绑定
*在套接字ns上读写数据直接结束
*关闭套接字ns
(2)客户端
*建立流式套接字,返回套接字号
*在套接字ns上读写数据,直接结束
*关闭套接字ns
5、Socket编程的层次结构
应用层
Socket开发接口
传输层
TCP/UDP
网络层IP
驱动
物理层
6、套接字工作在阻塞模式下5个会阻塞的winsock API是accpt() send() sendto() recv() recvfrom();
7、UDP编程是可否使用connect()为什莫?
可以使用,因为UDP的客户端调用connect()函数时并不是真正的发出建立请求链接的请求,调用姜葱本地操作系统直接返回,这样可以将服务器的地址信息保存下来,在后续UDP端口发送数据时,有套接字自动在发送函数中填入服务器地址而不需要由应用程序调用发送函数时填入。