网络程序设计第9章.docx
《网络程序设计第9章.docx》由会员分享,可在线阅读,更多相关《网络程序设计第9章.docx(35页珍藏版)》请在冰豆网上搜索。
网络程序设计第9章
第9章VMS操作系统下的DECnet网络编程
在介绍了Unix和Windows环境下的基于插口API、使用TCP/IP协议的网络应用编程后,本章我们将介绍另一种风格的网络应用编程:
VMS操作系统下的DECnet网络编程。
本章没有全面介绍VMS操作系统下的网络编程方法涉及到的概念、系统调用等,因此要求读者对于VMS操作系统、DECnet网络、VMS操作系统下的输入输出程序设计方法有一个基本的了解。
9.1概述
9.1.1VMS或OpenVMS
VMS是“VirtualMemorySystem”的缩写,在VMS开始支持Posix标准之后,VMS被称为OpenVMS。
因此,VMS与OpenVMS并没有什么本质区别,它只是为了更好地反映VMS支持Posix标准。
很多文献中仍然混用这两个名称,但现在有关VMS的产品资料中都称之为OpenVMS。
VMS是一个功能强大的、高可靠的、安全性好的操作系统,其功能类似于Unix操作系统。
它是美国数字设备公司DEC(DigitalEquipmentCorporation)开发的操作系统。
前几年,DEC公司被美国康柏公司(Compaq)收购,而成为Compaq公司的产品,但相关产品的名称基本上没有变化。
全世界有很多的计算机系统上安装的是VMS操作系统。
我们国家的不少行业也大量采用了VMS。
VMS操作系统的历史如表9-1所示。
VAX是“VirtualAddresseXtension”的缩写。
VAX11/780是第一个支持VMS操作系统的硬件平台(1977年研制成功的),然后是在PDP-10/11上。
现在,绝大部分运行VMS操作系统的硬件平台是使用DEC公司的Alpha芯片的工作站或服务器。
Alpha芯片是一个较早出现的64位RSIC(ReducedInstructionSetChip)微处理芯片。
表9-1VMS操作系统版本历史
版本
年份
特点
1.0
1978
第一个非beta版本
1.5
1978
2.0
1980
从RSXPIP中移植过来的基本的文件应用
2.1
1981
2.2
1981
2.3
1981
2.4
1981
3.0
1982
EDT编辑器,MONITOR,DECnet,单机BACKUP,ASMP
3.1
1982
(续表9-1)
版本
年份
特点
3.2
1982
3.3
1982
3.4
1984
3.5
1984
3.6
1984
3.7
1984
4.0
1984
簇(clusters),splitofVMSRTL,长文件名,DECnetphaseIV,DCLrecall/edit,CRTL,XQP,ACL's
4.1
1984
4.2
1985
4.3
1986
4.4
1986
卷遮蔽(volumeshadowing),TPU编辑器,SMG$-routines
4.5
1986
4.6
1987
4.7
1987
5.0
1988
SMP,LMF,DCLif-then-else-endif,kernelsplit,簇功能增强
5.1
1989
DECwindows
5.2
1989
5.3
1989
5.4
1990
基于主机的卷遮蔽(volumeshadowing)
5.5VAX
1991
POSIX,DECthreads,DECnetPhaseV
1.0AXP
1992
Alpha芯片上的第一个VMS版本
1.5AXP
1993
clusteronAlpha,SMPonAlpha
6.0VAX
1993
VIOC,C2分类,C++RTL
6.1VAX&AXP
1994
PCSI,movefile,XQP++
6.2VAX&Alpha
1995
管理站,DCL$PATH
7.0VAX&Alpha
1995
64bit支持(Alphaonly),内核线程(Alphaonly),快速IO路径(Alphaonly)
7.1VAX&Alpha
1996
内存通道(memorychannel)(Alphaonly),PIPE
7.2VAX&Alpha
1998
JDK(Alphaonly),ODS-5(Alphaonly),COM(Alphaonly),Galaxy(Alphaonly)
7.3VAX&Alpha
2000
XFC(Alphaonly),CPUhot-swap(Alphaonly),Kerberos,XML,LDAP
9.1.2DECnet
在比较著名的计算机网络体系结构中,除了TCP/IP,IBM的SNA(SystemNetworkArchitecture)外,还有一个重要的网络体系结构是DNA(DistributedSystemsArchitecture)。
DNA是美国DEC公司开发的分布式系统体系结构,是一个获得广泛使用的网络体系结构。
DECnet是DEC公司推出的计算机网络的名称,亦即DNA的一个具体实现。
到目前为止,DNA经历了五个版本(Phase),如表9-2所示。
在DNAPhaseV中,将DNA和OSI/RM有机地结合起来。
与此相对应的是DNA的实现也发展到目前的DECnet-Plus。
DECnet-Plus是DNAPhaseV的实现,它还支持Internet标准RFC1006和RFC1859,使得OSI/RM和DECnetPhaseIV应用可以在TCP/IP之上运行。
配置DECnet网络的操作系统有很多,如VMS,MicroVMS,ULTRIX-32,DOS,Windows等。
其中,大部分是配置在VMS或OpenVMS操作系统上。
表9-2DECnet网络体系结构DNA的变迁
版本
特点
PhaseI
仅限于两个结点之间的通信
PhaseII
最多可支持32个结点间的通信:
文件传输,远程文件访问,任务-任务间通信编程接口,网络管理
PhaseIII
最多可支持255个结点间的通信:
自适应路由,下线装载,记录访问
PhaseIV
最多可支持64,449个结点间的通信:
以太网支持,域路由(arearouting),主机服务,OpenVMS簇支持
PhaseV
无结点数限制:
支持OSI协议,透明地到TCP/IP的运输级链路,多厂商互连,本地或分布式名字服务,分布式网络管理
9.2DECnet网络编程基础
9.2.1基本概念
本节先介绍几个与DECnet网络资源有关的基本概念。
(1)结点(Node)。
DECnet网络中的每个独立的系统称为一个结点。
(2)线路(Line)。
线路是数据从网络中的一个结点送到另一个结点的物理通路。
(3)电路(Circuit)。
电路是以物理连接为基础的较高级逻辑连接,它是将数据从一个结点送到另一个结点的数据通信连接。
(4)逻辑连接(LogicalLink)或链路。
逻辑连接是两个进程之间通信的数据链路。
上述四个基本概念之间的关系是:
网络中的各个结点通过线路连接,电路在线路的基础上工作;各结点之间的所有输入和输出(I/O)活动都在电路上进行,多个用户可以使用同一条链路,可以指定一个结点具有若干条有效电路,这些电路在将该结点连接到网络中其他结点的若干条线路上工作。
一条逻辑链路连接两个进程,在一条或几条电路上输送进程间的双向通信流。
逻辑链路连接的进程或程序称为任务对象(Object)。
在一个VMS结点上,某些任务对象是DECnet系统程序(如Mail服务器);另一些可以是用户编写的程序。
在所有支持DECnet的系统上,均有一个网络管理模块:
网络控制程序NCP。
用户通过它可以直接访问DNA体系结构中的用户层以下三层中的任何一层。
可以通过NCP命令查看上述网络资源(相当于查看TCP/IP协议网络状态信息命令netstat),这些命令如表9-3所示。
表9-3用NCP命令查看DECnet网络资源
NCP命令
功能
showknownnode
查看系统中定义的结点
showknownline
查看系统中定义的线路
showknowncirc
查看系统中定义的电路
showknownlink
查看系统中现有的链路
showknownobject
查看系统中现有的任务对象
9.2.2任务到任务通信
DECnet的任务到任务通信允许一个网络结点上的应用程序(任务)能够与运行在远程结点上的另一个程序交换数据。
这种通信可分为透明的和非透明的两种。
透明的任务到任务间通信允许用户在网络上传送数据而不必知道它们正在使用DECnet网络,而非透明的任务到任务通信要在通信进程中使用DECnet网络所特有的属性。
对于VMS上的DECnet而言,任务到任务通信是通过访问远程文件来实现的。
通过任务说明串来指明你要访问的远程任务对象。
任务说明串的格式如下:
node_specification:
:
"TASK=taskname"或
node_specification:
:
"o=taskname"或
node_specification:
:
"n="
透明通信提供了一个任务和另一个任务在网络中通信所必需的基本功能:
(1)初始化和完成逻辑连接。
(2)在两个任务间顺序地交换报文。
(3)控制通信过程的结束。
非透明的任务到任务通信扩充了透明通信所提供的基本功能,从而允许非透明任务能接收和处理多个进入的连接即允许一个任务(目标任务或服务器)和多个任务(源任务或客户)间进行通信。
它允许用户使用DECnet专有的网络特性,如获取任务间连接和断开中的用户可选数据,以及源任务发送的中断报文,它还允许应用程序调整一个附加的控制参数,以交换信息。
下面是执行任务到任务间通信操作所需的功能或步骤:
(1)初始化逻辑链路连接。
请求到远程任务的逻辑链路;声明网络名,且处理多个入境连接请求(仅对非透明通信)。
(2)完成逻辑链路连接。
拒绝或认可链路连接请求。
(3)数据交换。
发送和接收数据报文或中断报文(仅对非透明通信)。
(4)终止逻辑链路。
以同步或异步方式断开逻辑链路。
本章主要介绍非透明任务到任务间通信的程序设计方法。
9.2.3所用系统服务调用
下表列出的是用于非透明通信操作的系统服务调用。
表9-4非透明通信所需的系统服务调用
系统调用
功能
$ASSIGN
分配I/O通道
$CANCEL
清除在通道上正在进行的I/O操作
$CREMBX
创建信箱
$DASSGN
异常中止逻辑链路连接
$GETDVI
得到有关设备的信息
$QIO(IO$_ACCESS)
请求一条逻辑链路连接
$QIO(IO$_ACCESS)
接收一个逻辑链路连接请求
$QIO(IO$_ACCESS|IO$M_ABORT)
拒绝一个逻辑链路连接请求
$QIO(IO$_ACPCONTROL)
给一个任务分配一个网络名字,使其能够接受多个入境连接请求(需要SYSNAM特权)
$QIO(IO$_DEACCESS|IO$M_ABORT)
异常中止逻辑链路连接
$QIO(IO$_DEACCESS|IO$M_SYNCH)
同步切断逻辑链路
$QIO(IO$_READVBLK)
接收一个报文
$QIO(IO$_READVBLK|IO$M_MULTIPE)
接收多个接收请求中的一个报文
$QIO(IO$_WRITEVBLK)
发送一个报文
$QIO(IO$_WRITEVBLK|IO$M_MULTIPLE)
发送多个写请求中的一个报文
9.2.4逻辑链路管理
任务间通信是在逻辑链路上进行的,NCP提供了一些命令用来管理逻辑链路。
这些命令如表9-5所示。
表9-5逻辑链路管理命令
NCP命令
功能
SETEXECUTERMAXINUMLINKSnumber
给定本地结点的最大的活动链路数目。
要注意的是该值包括所有入境和出境链路,因此,如果所有链路的两端均在本地,则只有number/2条链路
DISCONNECTKNOWNLINKS
切断逻辑链路
DISCONNECTlink_number
切断逻辑链路号为link_number的链路
SETEXECUTERINCOMINGTIMERnum
设定对本地结点的进程从收到逻辑链路连接到它接受或拒绝此连接的最长时间间隔为num秒
SETEXECUTEROUTCOMINGTIMERnum
设定发出连接请求到目的结点确认的时间间隔为num秒,此值一般在30到60之间
SETEXECUTERINACTIVETIMERnum
设定不活动计时器的时间间隔为num,当计时器超时时,DECnet将测试链路
9.2.5非透明通信过程中利用的数据结构
在介绍非透明通信过程之前,先介绍几个非透明通信过程中用到的重要的概念和数据结构。
(1)任务邮箱
“邮箱”是VMS操作系统中一种重要的进程间通信手段。
在非透明通信中,必须创建一个与网络相关联的邮箱代替逻辑链路来接收网络报文。
这些报文指明了任务间逻辑链路的接通和断开情况,以及网络的运行情况。
通过这些报文,用户可以对任务间通信实施适当的控制。
该邮箱可以利用运行库程序LIB$ABSN_WTH_MAX()创建,也可以先利用系统服务SYS$CREMBX()创建,然后再利用系统服务SYS$ASSIGN()将该邮箱和网络连接起来。
邮箱报文的格式用C语言来表示如下:
structnetwork_mailbox{
shortmsgtype;/*报文类型*/
shortunit;/*分配给用户的设备的单元号*/
charname_info[MAX_INFO_LENGTH];/*报文内容*/
};
报文类型的符号名字在MSGDEF.h中定义,用于非透明通信的报文类型如表9-6所示。
表9-6非透明通信的信箱报文类型
类型
说明
MSG$_TRMUNSOLG
主机提供的终端数据
MSG$_CRUNSOLIC
主动提供的数据
MSG$_ABORT
对方任务异常中止链路
MSG$_CONFIRM
网络连接确认
MSG$_CONNECT
网络入境连接初始化
MSG$_DISCON
对方任务切断链路,挂起
MSG$_EXIT
对方任务过早退出
MSG$_INTMSG
网络中断报文,多余的数据
MSG$_PATHLOST
到对方任务的网络路径丢失
MSG$_REJECT
网络连接请求被拒绝
MSG$_PROTOCOL
网络协议错误
MSG$_THIRDPARTY
网络被三者切断
MSG$_TIMEOUT
网络连接超时
MSG$_NETSHUT
网络已关闭
(2)网络连接块NCB
网络连接块是一个由用户生成的数据结构,它包含请求逻辑链路连接,接受或拒绝逻辑链路连接请求所必须提供的信息。
用C语言定义的完整的NCB(包含控制信息和可选数据)格式如下:
structnetwork_connect_block{
charnode_ID[NODE_ID_LENGTH];
charcontrol_info_start_ID;
charcontrol_info[CONTROL_INFO_LENGTH];
charcontrol_info_end_ID;
charnode_ID_sep[2];
chartask_name_start_ID;
chartask_name[TASK_NAME_LENGTH];
chartask_name_seperate_ID;
shortresrvd;
charoption_data_length;
charoption_data[OPTION_DATA_LENGTH];
charncb_end_ID;
};
NCB结构成员的含义如表9-7所示。
表9-7NCB结构成员的含义
成员名
含义
node_ID
目标任务所在结点的结点标志符
control_info_start_ID
控制信息开始标志符,它等于双引号(“);这一项仅当有控制信息时才有效
control_info
控制信息,这一项可选
control_info_end_ID
控制信息结束标志符,它等于双引号(“);这一项仅当有控制信息时才有效
node_ID_sep
结点标志符分隔符,一般为两个冒号(:
:
)
task_name_start_ID
任务说明串开始标志符,它等于双引号(“)
task_name
任务说明串
task_name_separate_ID
任务说明串分隔符,它等于斜杆(/)。
这一项仅当有下面的内容时才有效
Resrvd
保留字。
该项仅当有可选数据时才有用,当用于连接请求时它必须等于0。
对于连接接受或拒绝操作,该字包含一个内容的DECnet链路标志符,由DECnet软件在构造NCB时填写
option_data_length
可选项,仅当有可选数据时才用,它记录可选数据的长度
option_data
可选项,记录可选数据。
可选数据可以用作目标任务确定是否同意源任务的连接请求所考虑的条件,换句话说可以用作连接的口令用
ncb_end_ID
NCB结束标志符,它等于双引号(“)
举例说明如下(下面的描述是正确的):
structnet_con_blk{
charnode[6];
chartask_name_start_ID;
chartask_name[18];
charncb_end;
}ncb={“VAX4:
:
”,’”’,“task=requester”,’”’};
或
structnet_con_blk{
charnode[6];
chartask_name_start_ID;
chartask_name[18];
chartask_name_end_ID;
charncb_end;
}ncb={“VAX4:
:
”,’”’,“task=requester/”,’”’};
或
structnet_con_blk{
charnode[4];
charcontrol_info_start_ID;
charcontrol_info[13];
charcontrol_info_end_ID:
charnode_ID_sep[2];
chartask_name_start_ID;
chartask_name[18];
shortresrvd;
charoption_data_length;
charoption_data[16];
charncb_end;
}ncb={“VAX4”,’”’,“guest123456”,‘”’,‘:
:
’,‘”’,“task=server/”,0,
sizeof(“requester”),”requester”,’”’};
(3)网络功能块NFB
NFB是目标任务在声明网络名或任务对象号时用到的一个数据结构。
用C语言表示如下:
structnfb_fun_block{
charfunction_code;/*功能代码,宣告网络名时为NFB$_DECLNAM,所有代码
均在$NFBDEF.H中定义
*/
intobject_number;/*任务对象号*/
};
9.2.6非透明通信过程描述
本节介绍非透明通信过程,如下所述。
(1)分配通道给网络设备_NET:
,并创建邮箱。
用户可以先利用系统服务SYS$CREMBX()创建邮箱,然后利用系统服务SYS$ASSGN()给伪设备_NET:
分配通道并将它与所创建的邮箱相连。
用户也可以利用系统库子程序LIB$ABSN_WTH_WBX()一次创建并关联。
创建邮箱的目的是利用可选的网络协议特性,代替逻辑链路操作接收报文。
利用这些报文用户可以对通信进行适当的控制。
如果用户不需要报文,则不必创建与它相连的邮箱。
一般来说,目标任务(服务器)中需要创建邮箱,而源任务(客户)则根据需要可要可不要。
(2)声明网络名或任务对象号。
目标任务在分配通道号后,开始利用系统服务SYS$QIO(IO$_ACPCONTROL)分配一个网络名字或任务对象号给目标任务,从而使该任务可以处理多个入境连接请求。
用户必须使一个邮箱(在
(1)中创建的)和该通道相关联。
所有入境连接请求都被放在与发出I/O功能的通道相关联的邮箱中。
用户需要SYSNAM特权声明一个名字或任务对象号。
(3)请求逻辑链路连接。
用户在源任务中分配了I/O通道后,可以请求到目标任务的逻辑链路连接。
利用带有功能码IO$_ACCESS的SYS$QIO()系统服务来完成这一动作。
用户必须在SYS$QIO()中标识目标任务,利用NCB来完成。
另外,用户可以同时在NCB中发送1到16个字节的可选数据。
在源任务发出连接请求后,它可以发出带有功能码IO$_READVBLK的SYS$QIO()系统服务来读它的邮箱(如果有的话)以发现目标任务是否同意或拒绝连接请求。
(4)接收连接请求。
目标任务通过读它的邮箱来感知源任务发来的连接请求。
在接收到连接请求后,它可以通过带有功能码IO$_ACCESS的SYS$QIO()系统服务接受请求或通过带有功能码IO$_ACCESS|IO$_ABORT的SYS$QIO()系统服务拒绝请求。
在这里有必要介绍一下链路的建立过程:
当远程结点接收到请求逻辑链路的请求时,DECnet根据从调用中得到的信息构造一个NCB,此时有两种情况:
1)如果一个在远程结点上运行的任务已经声明了一个网络名或任务对象号,且该名字或任务对象号与所构造的NCB中标识的相同,那么DECnet把该NCB放入到此任务的邮箱中。
2)如果没有声明,那么DECnet必须创建一个进程执行该任务。
此时,SYS$NET等同于NCB,DECnet网络调用LOGIN.COM(如果有的话),它接着启动命令文件,该命令文件的名字按如下规则确定:
a.如果连接请求标识了一个数字(非零)的目标任务,那么在配置数据库中查找相应的记录,并且在该记录中找到命令文件的名字(该文件假定在目录SYS$SYSTEM中)。
b.如果连接请求标识了一个命名的目标任务,其类型为0(TASK),那么文件名假定为所要连接的任务的名字(类型为.COM),并且驻留在和访问控制信息相关的默认目录中。
在任务启动后,它可以确定是否同意连接。
从上面可以看出,远程任务可以由用户用run命令独立于DECnet被启动或者由DECnet启动。
如果网络任务由用户用run命令启动,则不检查访问控制。
对于第二种情况,在该任务声明了一个网络名字或任务对象号后,后续的入境