📄 00000018.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: SuperSB (孤鹰), 信区: Linux <BR>标 题: [转载]unix环境高级编程-18 <BR>发信站: BBS 水木清华站 (Wed Mar 15 14:31:58 2000) <BR> <BR> <BR> <BR> <BR>发信人: taosm (128+64-->cool), 信区: unix <BR>标 题: unix环境高级编程--第18章 调制解调器拨号器 <BR>发信站: 西十八BBS (Sat Mar 11 14:20:54 2000), 转信 <BR> <BR> <BR>第十八章 调制解调器拨号器 <BR>18.1 引言 <BR> 与调制解调器(modem)相关的程序要处理如此种类繁多的调制解调器是很困 <BR>难的。在大多数Unix系统中总有两个程序来处理调制解调器。第一个是远程登录程 <BR>序,它允许我们拨通另外的计算机、登录和使用远程系统。在系统V中这个程序叫 <BR>做cu,而BSD则称它为tip。它们完成类似的工作,而且都可以处理很多不同类型的 <BR>调制解调器。另一个使用调制解调器的程序是uucico,它是UUCP包的一部分。问题 <BR>是不同种类调制解调器的具体特性一般都包含在这些程序的内部,于是如果想写其 <BR>他使用调制解调器的程序,我们就不得不做这些程序类似的工作。同样,如果我们 <BR>想要改变这些程序,使其不通过调制解调器,而利用其它介质通信(例如网络连接 <BR>),那么也要做很大的改动。 <BR> 在这一章中,我们开发了一个程序来处理调制解调器所有需要处理的细节。我 <BR>们把所有这些的细节都集中到这一个程序中,而不是分散在多个程序里。(这个程 <BR>序的构思来自于Presotto 和Ritchie [1990]所描述的连接服务器)。为了使用这 <BR>一个程序,我们必须能如15.3节所说明的那样调用它,并使它传回文件描述符。然 <BR>后,我们用这个程序来开发远程登录程序(类似cu和tip )。 <BR>18.2 历史 <BR> cu(1) 命令(意思是call unix)是在Version 7中出现的。但它只能处理一种 <BR>特殊的自动拨号单元(ACU)。伯克利的Bill Shannon修改了cu,并把它实现在4. <BR>2BSD的tip(1)中。这之间的最大改变是使用了一个文本文件/etc/remote来存放所 <BR>有的系统信息(电话号码、优先的拨号器、波特率、奇偶校验、流控制等)。这个 <BR>版本的tip支持六种不同的拨号单元和调制解调器,但要支持其他种类的调制解调 <BR>器则要修改源码。 <BR> 与cu和tip一样,UUCP系统也可以使用调制解调器和自动拨号单元。UUCP对不 <BR>同的调制解调器进行加锁,因此多个UUCP的实例可以同时运行。这样,tip和cu程 <BR>序就不得不遵循UUCP协议,避免与UUCP冲突。在BSD系统中,UUCP使用了它自己的 <BR>拨号函数。这些函数被连接到UUCP的可执行程序中,这样增加新的调制解调器也需 <BR>要修改源码。 <BR> SVR2提供了一个dial(3)函数来将调制解调器拨号的一致特性归纳到一个库函 <BR>数中。这个函数由cu使用,但UUCP不使用。这是一个标准的C库函数,所以可以被 <BR>一般程序使用。 <BR> Honey DanBer UUCP系统,是将调制解调器命令从C源程序中抽取出来,将它们 <BR>放在一个Dialers文件中。这就允许不修改源码就加入新类型的调制解调器。但是 <BR>cu和uucp所使用的访问Dialers文件的函数不是很通用。这说明cu和UUCP可以不重 <BR>新开发代码去处理Dialers文件中的拨号信息,但除了cu和UUCP以外的程序并不能 <BR>使用这个文件。 <BR>在所有的这些版本的cu、tip和UUCP中,加锁保证了在同一时间只有一个程序使用 <BR>某一设备。因为这些程序工作在不同系统中,早期的版本不提供记录锁,而使用一 <BR>个早期形式的文件加锁。这会导致当一个程序崩溃时,该锁文件仍旧保留,所以又 <BR>开发特殊的技术来处理这种情况。(对特殊设备文件不能使用记录锁,所以记录锁 <BR>也不能完全解决问题)。 <BR>18.3 程序设计 <BR> 我们来分析一下调制解调器拨号器(dialer)所应该具有的特性。 <BR> 1.它必须在不改动源码的情况下支持新增加的调制解调器类型。 <BR> 为了达到这个目标,我们使用了Honey DanBer的Dialers文件。我们将所有使 <BR>用这个文件来拨号调制解调器的代码都放到一个精灵服务进程中,这样任何程序都 <BR>可以使用15.5节中的客户机-服务器函数来访问它。 <BR> 2.一定要使用一些特定形式的锁,以保证当那些持有锁的程序在非正常结束 <BR>时能自动释放它的锁。以前那些专门的技术,如那些在大多数cu和UUCP版本中仍然 <BR>使用的技术,都不应再使用。 <BR> 我们用一个服务器精灵进程来处理所有设备加锁。因为在15.5节中的客户机- <BR>服务器函数会在客户机终止时自动通知服务器,所以这个精灵进程能释放进程所持 <BR>有的任何加锁。 <BR> 3.新的程序一定要能够使用我们所开发的所有特性。开发一个新的处理调制 <BR>解调器的程序不应当什么都要自己实现,它拨任何类型的调制解调器应该就象函数 <BR>调用一样简单方便。为此,我们让中央服务器精灵进程处理所有与拨号有关的操作 <BR>,并返回一个文件描述符。 <BR> 4.客户机程序,例如cu和tip,不应当需要特别权限。这些程序不应当是设置 <BR>用户ID(set_user_ID)程序。但是我们要给予服务器精灵进程特殊权限,允许客 <BR>户机程序运行时无需特权。 <BR> 显然我们不能改动已有的cu、tip和UUCP程序,但应该让其它程序在我们工作 <BR>的基础上实现起来更加简单。当然,我们也一定要充分吸取已有的Unix 拨号程序 <BR>的优点。 <BR> 图18. 1描述了客户机-服务器工作模式的结构。 <BR>图18. 1 客户机-服务器工作模式的示意图 <BR> 建立与远程系统的通信过程如下: <BR> 0.启动服务器端进程 <BR>1. 客户端程序启动,使用cli_conn函数(15.5节)建立与服务器端程序的连接。 <BR>客户端程序向服务端发出一个请求,请求拨号远程系统。 <BR>2. 服务端程序读取Systems、Devices和Dilaers配置文件来决定如何拨号远程系 <BR>统(我们在下一部分讲述这些文件)。如果正使用一个调制解调器,在对应的Dia <BR>lers配置文件中就包含了这个特定调制解调器的所有命令。 <BR>3. 服务端程序打开该调制解调器设备并拨号该调制解调器。这需要一些时间(一 <BR>般15-30秒)。服务端程序处理所有对该调制解调器的加锁,以避免各用户间的冲 <BR>突。 <BR>4. 如果拨号成功,服务端程序返回一个该调制解调器设备的文件描述符给客户端 <BR>。在15.3节中的函数可以发送和接受这个描述符。 <BR>5. 客户端直接与远程系统通信。服务器端不再参与这个过程。客户端读写上一步 <BR>返回的文件描述符就可以了。 <BR> 客户端与服务端的通信过程(步骤1-4)是通过一个流管道进行的。当客户端 <BR>完成与远程系统的通信时,客户端关闭该流管道。服务端发现该管道关闭,释放对 <BR>调制解调器设备的加锁。 <BR>18.4 数据文件 <BR> 在这一部分,我们描述Honey DanBer UUCP系统所使用的三个文件:Systems、 <BR> Devices和Dialers。在这些文件中有很多UUCP所使用的域。我们这里不详细讲述 <BR>这些域和UUCP系统本身。参考Redman [1989]可得到更详细的信息。 <BR>18.2 分栏列出了在Systems 文件中的六个域。 <BR> name time type class phone login <BR> host1 <BR> host1 <BR> host1 <BR> modem <BR> laser Any <BR>Any <BR>Any <BR>Any <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -