Understanding Unix/Linux Programming 笔记:chapter 13:基于数据报(Datagram)的编程:编写许可证服务器

来源:互联网 发布:现货黄金教学软件 编辑:程序博客网 时间:2024/05/11 00:55

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时连接的地址决定。