基于TELNET协议的DELPHI程序与LINUX主机通信的实现
--------------------------------------------------------------------------------
1.?Telnet协议简介
Telnet协议的目的是提供一种通用的、八比特位定向通信手段,其基本功能是通过网络提供远程登录或虚拟终端能力。Telnet协议可以用来进行终端-终端的通信(连接)或进程-进程的通信(分布计算)。
Telnet连接实际上是一种TCP/IP连接,它通过在TCP传输数据流中嵌入Telnet控制信息来实现连接,Telnet通过TCP端口23提供服务。它的建立与实现基于三种思想:“网络虚拟终端”的概念;子协商操作原理;对称终端和过程。
2.?环境配置
Delphi提供了一种全新的Windows应用程序开发方法,它速度快,具有强大且容易使用的可视化开发环境,具有领先的数据库技术和强大的网络编程能力。
使用Delphi开发工具(Object Pascal语言),利用Telnet协议实现与Linux主机的通信,首先要建立环境,即Linux与Windows 95联网。这里,Windows 95环境下的Delphi应用程序将作为客户端,而Linux操作系统将作为服务器,它们之间的关系如下图。
(1)安装Linux
按操作指南安装Linux操作系统。Linux是Unix操作系统的一个变种,它采用了微内核技术。
(2)配置网络
1)启动Linux,并键入“root”以管理员身份登录。运行netconfig,根据屏幕提示配置网络的服务器名、域名、主机的IP地址、子网屏蔽及命名服务器IP地址。
2)修改rc.modules文件
此文件是Linux系统的资源配置模块文件,由于Linux并没有自动配置网络的功能,所以必须进行手工配置。
进入etc/rc.d目录,用vi命令编辑rc.modules文件。在Network族中,将适用自己的网卡处(如ne IO=0xnn)前面的屏蔽位“#”去掉,然后修改IO端口(如IO=0x240)。键入qw命令保存修改,退出文件。此修改后的文件将被加入到Linux系统文件中,并在Linux启动时自动生效。重新启动Linux,将会看到以下的网络配置提示信息:
Network NE2000 IO=0x240,11
3)测试服务
为已物理连接的具有Windows 95操作系统的客户机添加TCP/IP协议,并配置好IP地址及标识。重新启动以使配置生效,在Linux操作系统下键入“ping+IP地址”来测试网络的连接,将会看到请求连接建立的时间等信息,与此同时,95已经通过TCP/IP协议连接成功,如要测试Telnet服务,只须在Linux服务器上执行Telnet命令即可。
3.?网络编程(Delphi应用程序与Linux主机通信)
目前,软件领域流行的网络编程的资料及代码范例,基本上都是基于C语言开发的。C语言是一种半高级语言,对于指针、内存操作有极大的灵活性,而Pascal是一种高级语言,其内部具有许多保护机制,避免了许多影响操作系统正常运行的误操作。
由C向Object Pascal(Delphi编程语言)的代码转化并不是非常困难的事情,困难在于C语言结构与Object Pascal不同,类型、变量的表示也相差很大,这就需要熟悉C语言结构与Object Pascal的联系与区别,特别是必要的数据结构的表示方法。
下表列出作者在实现Telnet协议时,通过实际摸索得出的C语言与Object Pascal在数据结构与语法表示方面在网络编程中的差异:
Delphi网络编程支持Winsock,其中的许多函数均可以直接调用,但要注意函数调用过程中Pascal语言的参数传递风格,尤其要小心指针参数的正确使用(如表中所列)。
(1)建立连接
由于Object Pascal支持Winsock,在程序定义阶段的uses部分加入Winsock的说明,这样就可以使用Winsock中的函数。
直接启动WSAStartup()。将套接字s设为Tsocket类型,调用socket()创建套接字。初始化socket地址(Psockaddr类型),设置Linux服务器的IP地址。
调用connect函数建立连接,其主机结构参数由初始化的Psockaddr结构决定。此中要注意网络字节顺序及数目,如运用不当,很可能无法建立连接。
(2)协商通信
一旦连接成功,主机将发回请求信息,从而进入Telnet协议的子协商过程。子协商过程,是客户与服务器之间以协议约定好的命令结构形式的数据流进行相互通信的过程。这种子协商过程的命令结构如图所示:
这些命令符都是八比特的ASCII字符,命令之间没有任何间隔符,这些ASCII字符可以用ord()和chr()函数来进行字符与数字之间的转换。
建立接收缓冲区,调用recv()或recvfrom()函数等待服务器发送的信息。通常,服务器将发送如下子协商命令:
IAC DO TERMINAL-TYPE (终端类型)
IAC DO TERAMINAL-SPEED(终端速率)
IAC DO X-DISPLAY-LOCATION(显示方式)
IAC DO ENVIRONMENT(环境)
建立发送缓冲区,根据上述信息进行回应,调用char()函数,将命令代码转换为ASCII字符填入发送缓冲区,注意在“选项”中出现的非命令字符的字符串(如表示终端类型的字符串)要以NVT ASCII String形式出现。调用send()或sendto()函数发送至服务器,并等待服务器的回应信息,此后按照Telnet协议进一步进行子协商。例如,可以这样进行回应:
IAC DO TERMINAL-TYPE(协商终端类型)
IAC DONT TERMINAL-SPEED(不协商终端速率)
IAC DONT X-DISPLAY-LOCATION(不协商显示方式)
IAC DONT ENVIRONMENT(不协商环境)
一旦子协商命令执行完毕,服务器将发送服务器本身的版本信息和登录信息,如上述Linux与95连网系统将会得到:
IAC WILL ECHO 换行 回车 Linux 2.0?0(Server.user)(ttypo)换行 回车server login
此时将提示用户输入帐号,进行远程登录,如登录失败(如服务器没有要登录的帐户),则服务器返回空信息,并继续等待用户进行登录,直到60秒后,服务器将发送:
Login times out after 60 seconds 换行 回车
并断开与客户已建立的虚电路连接,此时用户的发送与接收命令都将产生错误,这种错误可以通过调用WSAGetLastError()函数得到错误代码。
登录成功后,服务器将返回服务器版本信息,最近一次登录信息及用户有关信息等。此时,客户(Windows 95)与服务器(Linux)就可以使用服务器的Telnet服务进行数据传输,客户已经成为服务器的一个远程虚拟终端,客户机通过数据传输方式将等待执行的指令发送到服务器一端。服务器得到数据,将分离出的命令指令在后台执行,并将执行结果以数据形式返回给客户机,如发送“ls”命令,将列出当前服务器的目录信息。
本文所讨论的基于Telnet协议的Delphi与Linux主机通信的这一软件,在实际的LAN中运行良好。开发这一软件的目的是探讨在Delphi下运用Object Pascal语言进行网络编程的基本方法,以及Telnet协议的实现流程。本文的着眼点在于为网络编程人员提供利用Object Pascal语言进行网络编程的一点经验,尤其是由C代码向Object Pascal转化中的一些注意事项,以免进入误区。
--------------------------------------------------------------------------------