我们来分析一下调制解调器拨号器所应该具有的特性:

  1. 支持新调制解调器类型:它必须在不改动源码的情况下支持新增加的调制解调器类型。为了达到这个目标,我们使用了Honey DanBer的Dialers文件。我们将所有使用这个文件来拨号调制解调器的代码都放到一个精灵进程服务器中,这样任何程序都可以使用15.5节中的客户机-服务器函数来访问它。

  2. 设备加锁机制:一定要使用一些特定形式的锁,以保证当那些持有锁的程序在非正常结束时能自动释放它的锁。以前那些专门的技术,如那些在大多数cu和UUCP版本中仍然使用的技术,都不应再使用。我们用一个服务器精灵进程来处理所有的设备加锁。因为15.5节中的客户机-服务器函数会在客户机终止时自动通知服务器,所以这个精灵进程能释放进程所持有的任何加锁。

  3. 使用所有特性:新的程序一定要能够使用我们所开发的所有特性。开发一个新的处理调制解调器的程序不应当什么都要自己实现,它拨任何类型的调制解调器应该就像函数调用一样简单方便。为此,我们让中央服务器精灵进程处理所有与拨号有关的操作,并返回一个文件描述符。

  4. 权限设置:客户机程序,例如cu和tip,不应当需要特别权限。这些程序不应当是设置-用户-ID程序。但是要给予服务器精灵进程特殊权限,允许客户机程序运行时无需特权。显然我们不能改动已有的cu、tip和UUCP程序,但应该让其他程序在我们工作的基础上实现起来更加简单。当然,我们也一定要充分吸取已有的UNIX拨号程序的优点。

图18-1描述了客户机-服务器工作模式的结构。建立与远程系统的通信过程如下:

  1. 起动服务器

  2. 客户机起动,使用cli_conn函数(见15.5节)建立与服务器的连接。客户机向服务器发出一个请求,请求拨号远程系统。

  3. 服务器读取Systems、Devices和Dialers配置文件来决定如何拨号远程系统(下一节将讲述这些文件)。如果正使用一个调制解调器,在对应的Dialers配置文件中就包含了这个特定调制解调器的所有命令。

  4. 服务器打开该调制解调器设备并拨号。这需要一些时间(一般为15~30秒)。服务器处理所有对该调制解调器的加锁,以避免各用户间的冲突。

  5. 拨号成功,服务器返回一个该调制解调器设备的文件描述符给客户机。在15.3节中的函数可以发送和接受这个描述符。

对于想要了解更多客户机-服务器通信模拟的朋友们,可以访问这里,这是一份非常详细的模拟文档。如果你对.NET网络通信的客户机服务器感兴趣,这个链接也许正适合你。而对于那些想要在Linux中实现客户机服务器通信的开发者们,这篇文章将会提供很多有用的信息。

既然我们谈到了拨号和设备加锁,或许你会对西门子工业远程通信调制解调器的技术问题感兴趣,点击这里可以了解更多。