第十一章 连接到近端或远端的进程:服务器与Socket(套接字)
1. 产品和服务的概念
2. 一个简单的比喻:饮料机接口
提供一个接口,合成不同口味的饮料。这类似于Unix提供一个接口来处理来自不同数据源的数据。4种数据源:磁盘文件;设备;管道;Socket
3. unix中使用的计算器:bc
1) bc与dc构成的客户/服务模型;双向的通信;永久服务(区别于shell中fork+exec每次开一个新的进程执行一条新的命令,bc让单一的dc处于运行状态来进行数据处理)
2) 编写bc:使用pipe、fork、dup、exec
在这个程序中,似乎没有看到程序的出口。
4. 协同进程的讨论:什么样的两个进程可以成为协同进程
5. fdopen:让文件描述符像文件一样使用(其实文件描述符和FILE*文件可以相互转化)
6. popen:让进程看似文件(popen将上述pipe、fork、dup、exec等函数封装在一起,使得对程序和文件的操作统一)
1) fopen打开一个指向文件的带缓存的链接FILE*;
2) popen打开一个指向进程的带缓冲的链接;
3) popen第一个参数是要执行的命令,可以使任何shell命令,第二个参数是“r”或者“w”,不能是“a”,popen要用pclose关闭。
7. popen的实现:使用fdopen命令
1) popen运行一个程序并返回指向该程序的标准输入或标准输出的连接;
2) 使用上述pipe、fork、dup、exec等函数实现popen
8. 访问数据:文件,应用程序接口(API)和服务器
1) 文件:open、read
2) 直接封装好的API
3) 从进程获取数据:popen
9. Socket:与远端进程相连
管道的两个缺陷:管道在一个进程中被创建,通过fork实现共享。因此管道只能连接相关的进程,且只能连接在一台机器上的进程。Socket允许连接不相关的进程,且允许连接不同计算机上的进程。
1) 类比:电话报时服务流程
2) 因特网时间、DAP和天气服务器
3) 服务列表:众所周知的端口
4) 编写timeserv.c:时间服务器(类比电话报时服务流程,涉及的函数)
socket、bind、listen、accep(阻塞进程知道有请求)、向accept返回的文件描述符写入应答数据、close关闭该文件描述符
5) 编写timeclnt.c:时间服务客户端
socket、connect(成功返回0,说明sockid是一个合法的文件描述符)、readsockid
10. 另一种服务器:远程的ls(打印远程主机上目录列表的程序,重点是协议)
11. 软件精灵(开机后台运行的服务器程序)
12. 小结
1) 一些程序被作为单独的进程建立起来来接收和发送数据,在客户/服务模型中,服务器进程为客户提供数据处理或数据服务
2) 客户/服务器系统包含通信系统和协议。客户和服务器通过管道或socket进行通信。协议时绘画过程中一些列规则的集合。
3)popen函数将程序像文件一样来访问
4) 管道是一对相互连接的文件描述符。socket是一个未连接的通信端点,通过fdopen还可以变为一个潜在的文件描述符。客户通过把自己的socket和服务器端的socket相连接来创建一个通信连接
5) socket的标识:机器地址和端口号
6) 文件描述符提供了与文件、设备、其他进程的统一的编程接口
----------------------------------------------------------------------------------------
本文链接http://blog.csdn.net/yongchurui/article/details/28728977
2014.06.05