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时连接的地址决定。
- Understanding Unix/Linux Programming 笔记:chapter 13:基于数据报(Datagram)的编程:编写许可证服务器
- Understanding Unix/Linux Programming 笔记:chapter 12:连接和协议:编写Web服务器
- Understanding Unix/Linux Programming 笔记:chapter 7:事件驱动编程:编写一个视频游戏
- Understanding Unix/Linux Programming 笔记:chapter 8:进程和程序:编写命令解释器sh
- Understanding Unix/Linux Programming 笔记:chapter 11:连接到近端或远端的进程:服务器与Socket(套接字)
- Understanding Unix/Linux Programming 笔记:chapter 14:线程机制:并发函数的使用
- Understanding Unix/Linux Programming note:chapter 6:为用户编程:终端控制和信号
- Understanding Unix/Linux Programming 笔记:chapter 15:进程间通信(IPC)
- Understanding Unix/Linux Programming 笔记:chapter 9:可编程的shell、shell变量和环境; chapter 10:I/O重定向和管道
- Understanding Unix/Linux Programming-时钟编程:Alarms
- Understanding Unix/Linux Programming note:chapter 1:执行可执行文件时的参数传递
- Understanding Unix/Linux Programming note:chapter 1:more函数的流程图
- Understanding Unix/Linux Programming note:chapter 2, chapter 3, chapter 4
- Understanding Unix/Linux Programming-事件驱动编程:编写一个视频游戏
- Understanding Unix/Linux Programming note:chapter 5:连接控制:学习stty
- Understanding Unix/Linux Programming-cp指令练习
- Understanding Unix/Linux Programming-who指令练习
- Understanding Unix/Linux Programming-pwd指令练习
- linux多线程编程
- C++ 程序设计原理与实践 第四章答案
- cocos2d-x节点(CCData.h)API
- cocos2d-x节点(CCDataVisitor.h)API
- linux守护进程
- Understanding Unix/Linux Programming 笔记:chapter 13:基于数据报(Datagram)的编程:编写许可证服务器
- cocos2d-x节点(CCDouble.h)API
- cocos2d-x节点(CCFloat.h)API
- cocos2d-x节点(CCGeometry.h)API
- cocos2d-x节点(CCInteger.h)API
- cocos2d-x节点(CCObject.h)API
- linux进程调度
- cocos2d-x节点( CCSet.h)API
- cocos2d-x节点(CCNS.h)API