Key-word: 数据报socket,TCP, UDP, socket, sendto, recvfrom
注:本章与chapter11对照学习
基本概念:
流socke使用的网络协议叫TCP即传输控制协议(Transmission Control Protocol)。之前章节学习的客户/服务器都属于流socket。
数据报socket叫UDP,即用户数据报协议(User Datagram Protocol)
两者之间的区别:
1)客户端
TCP的客户端的流程为:socket-connect-read/write-close。
UDP的客户端的流程为:socket-sendto/recvfrom-close。
可知,TCP的客户端需要建立连接(connect,建立客户端sock_id与服务器地址的连接),然后使用该连接进行单向、双向或类似管道的字节流传送。UDP的客户端不需要建立连接,直接向服务器地址发送消息。
这个区别在许可证服务器中有所体现:在客户端程序中,建立完socket之后,就可以用sendto/recvfrom 向/从 服务器地址发送/接数据了。
2)服务器端
TCP的服务器端流程为:socket-bind-listen-accept-read/write-close。
UDP的服务器端流程为:socket-bind-recvfrom/sendto-close。
可知,UDP没有监听服务器地址和阻塞进程,在建立完sock_id与服务器地址的连接后,就可以进行数据的收发了,主动性更强。
注意:UDP必须先从客户端recvfrom数据,之后才能向客户端地址sendto数据。因为UDP是用服务器地址从客户端recvfrom数据,同时在recvfrom时获取客户端地址,然后才能用sendto向客户端地址发送数据。
即客户端/服务器通信之前,客户端需要知道服务器的地址,但是服务器无需知道客户端的地址。
内容概述:
13.5
介绍了简单的数据报编程。客户端/服务器流程如上所述,然后将服务器端流程中的“socket-bind”集成到make_dgram_server_socket函数中,将客户端流程中的“socket”放在make_dgram_client_socket函数中。
13.6
介绍许可证服务器。流程与上述数据报流程相似,只是更加复杂。
如下是客户端程序的分层图,只能上层调用下层,do_transaction只能被get_ticket和release_ticket调用。
该程序的核心在do_transaction的实现。Do_transaction向服务器发送get/release ticket的信号,然后从服务器接收信号来判断get/release ticket是否成功。
如下服务器端程序的分层图。核心在handle_request的实现。Handle_request首先解析在main中从客户端接收到的数据,判断客户端是要get还是release ticket;然后调用do_hello或者do_goodbye来从数据库中get/release ticket;最后将get/release ticket的结果发送给客户端。
13.7
讲述对两种可能出现的两种异常崩溃的处理:客户端崩溃和服务器崩溃。
13.8
分布式许可证服务器。讲述如果有多个客户端,且各客户端都运行在不同的机器上该如何处理。
可以在客户端机器上建立本地服务器,本地服务器作为客户端和中央服务器的中介。
13.9
Unix域socket。Unix域socket只适合客户端和服务器都在同一台机器上的情况。是UNIX域还是INET域由socket/bind时连接的地址决定。