2012年3月12日星期一

局域网上的点对点通信

整理旧文档,发现了这篇很陈旧的论文,这是我十年前写的第一篇论文,也是我第一篇在杂志上发表的论文,同时也是我大学的毕业设计论文。

十年前,我写毕业设计论文的时候,为了写这篇论文也花费了我不少的时间和精力,整天都泡在图书馆里。今天再看这篇文章,竟然感觉如同隔世的感觉,那时候什么是网络呢?Windows95刚刚发布,WindowsNT和Windows2000都没有普及,网络在那时还是一个神秘而高深的技术,那时我们建立局域网用的一律都是Novell系统,没有图形环境,设置非常繁琐复杂。而现在,这些东西完全都过时了,那时候先进的TCP/IP现在面临其协议不安全、有漏洞的指责,NETBIOS和IPX就早已失传了,十年时间,竟然整个网络技术发生了如此天翻地覆的变化,慨叹,自己都已经快跟不上这个时代了。

这篇文章还是重新发布一下,以做纪念。

局域网上的点对点通信

摘要:本文讨论了在局域网络环境下,实现工作站之间的实时通信的三种方法.重点介绍了基于NetBIOS 及TCP/IP协议实现工作站之间的点对点通信(Peer to Peer), 并给出了设计的应用程序实例.

关键词:局域网 点对点通信 NetBIOS TCP/IP IPX/SPX

一  引 言

在信息化社会里,人们都希望以快速简的方法获取信息,计算机网络的出现,使人们的这个想法得以实现.通过计算机网络,人们可以方便地实现通讯和共享资源:计算机网络使信息传播和信息处理加工的设备和工具空前紧密地结合在一起,这种技术的进步和发展对提高人类社会信息化水平有着巨大的推动作用.

但在实际的计算机网络中,往往需要互连来自不同厂家的机器,要具备异 种机的互联能力.由于各厂家的机器有其各自的总线结构,文件系统,输入输出系统和采用的字符集等,因而使这种互联成为一件十分困难的事情.

另外,从局域网的运行情况来看,以Novell Netware网络为例,文件服务器是网络的核心,其上运行Netware操作系统软件,为网上工作站提供共享资源与服务.因此,文件服务器的好坏对网络的性能极其重要.随着网络的扩大,连接的工作站增多,服务请求也迅速增加,服务器的负载也相应加重,服务器有可能成为网络工作的"瓶茎".

针对上述情况,本文利用网络上的点点通信思想,在不使用服务器的情况下实现不同工作站之间的文件传输和共享打印.

二  局 域 网 概 述

随着微型计算机技术的迅猛发展和日益成熟,微型计算机的价格在不断下降,因此人们有条件的将十几台微机,外设依网络通信协议连接起来,形成局域网(Local Area Network).它具有以下几个特点:

1) 采用基带传输,传输速度较高.

2) 网络覆盖地域较小,可不用调制解调器.

3) 传输误码率低.

局域网的功能概括起来可归为以下几点:

1) 资源共享.包括大容量硬盘,高速打印机,数据及软件.

2) 电子邮件系统.

3) 使用分布处理实现负载均衡.

机算机网络中对于各种约定做了如下定义:将机算机网络同等层间的通信约定称为网络协议.将不同层的通信约定称为接口.到目前为止最有代表性的网络分层模型有两种.其一为国际标准化组织(ISO)所提出的开放系统互连(OSI)七层协议参考模型,其二为美国电气与电子工程师学会(IEEE)802委员会所提出的参考模型.

(一) ISO/OSI七层协议及参考模型

OSI参考模型的七层分层结构如图1所示.该模型是按逻辑组合功能来分层的,上一层是建立在下一层的基础上,较高层向较低层提供服务请求,而较低层为较高层提供服务.所谓开放系统是指按照这种模型所构成的网络是可以互连的,是彼此开放的,从而便于世界各地的网络互连.

OSI模型各层定义如下:

  应用层 网中的网络应用软件在此层运行.

  表示层 辅助用户执行诸如文间传送,程序运行等任务.

  会话层 管理低层与用户之间的连接,是用户到网络的接口.

  传输层 检查网络数据的完整性,必要时将数据分组调整到正确的位   置.设置分组题头,以便将数据组发送到目的地.

  网络层 以分组形式,选择路径发送数据.各分组要穿过两个低层到达目的地.

  数据链路层 管理网络接口处的输入/输出.对原始数据进行组织和检察.

  物理层 定义在网络电缆连接及接线中用的规则与协议.包括例行联络处理及传输规范,还定义了使用的电缆类型及连接器.

(二) IEEE 802标准局域网络参考模型

IEEE 802标准遵循ISO/OSI参考模型的原则,解决了最低两层----物理层和数据链路层的功能以及与网络层的接口服务,网际互连有关的高层功能,IEEE 802 LAN 参考模型与ISO/OSI 参考模型的对应关系如图3所示.

1 IEEE 802 的五个标准文件

  IEEE ( Institute of Electical and Electronics Engincers ),即电气和电子工程师学会,它是一个专业性质的学会.它对OSI模型的低两层即物理层及数据链路层的协议标准进行了大量的研究.IEEE 802标准制定目的是为了在不同的厂商所制造的设备间具有兼容性,从而为使用该网络的用户和设备制造者在付出较小的代价后就能顺利地在这些设备间进行通信.该学会在经过多年的研究和修订,于1984年正式提出了局域网标准的五个标准文件.

IEEE 802.1 它阐述了802方案与ISO互连参考模型间的关系.

IEEE 802.2 逻辑链路控制标准.

IEEE 802.3 采用CSMA/CD访问的总线结构标准.

IEEE 802.4 采用令牌访问方法的总线结构标准.

IEEE 802 各标准间的关系如图2所示.

2 IEEE 802 LAN 标准局域络参考模型 

从对ISO参考模型的讨论中以然清楚的了解到物理层,数据链路层及网络层共同完成了报文分组的传输功能,因此物理层,数据链路层是必不可少的.但考虑到局域网络的特点,IEEE 802对OSI参考模型作了修正.IEEE 802将数据链路层分为两个子层,即逻辑链路子层(LLC)和介质访问控制子层(MAC).在MAC子层中CSMA/CD,令牌总线(Token Bus),令牌环(Token Ring)等几种介质访问控制方式.在数据链路层同网络层的接口设置了服务访问点(SAP).

三  网 络 通 信 及 实 例

(一) 进程通信

进程,指程序的一次执行.进程通信指各进程之间共享资源,相互进行数据传输的信息交换方式.OSI的传输层为进程通信提供了服务.

进程通信的实现方法:

1) 建立和拆除进程间的连接

2) 信息传递与控制

(二) 点对点通信

从OSI参考模型的应用层来看,可认为网络是由工作站和服务器组成的,但从传输层和网络层的角度看,工作站和服务器没有本质的区别,它们都是连接到网络上的一台机器,都可以用网络地址或名称来代替.它们之间的通信,就是所谓的点对点通信,也叫对等通信.在局域网上,点点通信意味着两个工作站可以直接对话而不用经过文件服务器中转.

(三) 实例:  Windows 95的点对点网络通信功能:

Windows 95操作系统的Network Neighborhood(网络邻居)的三个重要的部分是:Netware的客户服务,点对点对等服务,Internet或/TCP/IP服务.

在Windows 95内建的点对点对等网络功能,可以很容易地在一个小 工作组内共享文间和打印机,而不用文件服务器.Windows 95 比Windows for workgroup3.11最具特色的功能之一是:它有一个大大改进的安全方案,每个用户即可以在用户级又可以在资源级共享文件和打印机等资源.

在Windows 95下,点对点的对等网络具有更大的灵活性,因为它可在Netware多用户(运行于IPX/SPX或TCP/IP协议下)之间建立点对点对等连接.Windows 95 能做Windows for workgroup 客户能做的每件事,还可以做得更好.

无论用户选用什么样的平台,他们都可以利用Network Neighborhood非常方便地浏览网络资源.用户选中工作台面上的一个图标即可直接进入Network Neiborhood工作窗口,此后,用户不关心网络连接,驱动器映像,打印机队列等工作,即可连接到任意类型的网络服务器,浏览服务器中的文件或其它共享资源.

安装对等网络服务功能具体是这样的,从Control Panel中打开Network对话窗口,移动其中的Configuration标签,点中add按扭后,在弹出窗口中选择Client.此后,会弹出一个Select Network Client(选择网络客户)的对话窗口,选中其中的Client for Microsoft Network后,点OK按扭.重新启动机器后,在Network Neighbour hood中将显示同一工作组中共享文件的所有客户.同时,在Network Neighborhood中也列出了网络中的Microsoft,Warp Connect以及IBM LAN Server域名,Microsoft工作组和Netware通过使用全局命名规则(Universal Naming Convention,UNC)而不是通过驱动器映射到的Netware网络服务器.

文件共享在Configuration标签中设置File and Print Sharing(文件与打印共享)选择项,然后在Access Control(访问控制)标签中选中Share Level Access Control项,为了配置共享选择项,必须返回到Desk top或Explorer中,用鼠标右键在准备共享资源(如键盘,光驱)上点一下.此后,会弹出一共享设置Sharing对话框.如使用Netware网络,那么结果是:要么网络中其他用户都可以访问你的共享文件,要么无人可访问.

四  点 对 点 通 信 的 实 现

局域网中工作站之间的通信程序的开发一般通过四种途径:第一种是通过改造网络原有通信软件来实现.但这种改造必须以对该软件充分了解为基础,否则改造后很难保证不影响网络的整体性能,甚至会造成系统运行不可靠,而改造后的通信质量不一定理想.第二种是利用Novell网本身的网络协议IPX/SPX来实现,由于这种方法开发比较麻烦,采用的并不多.第三种是通过NetBIOS功能调用来实现,NetBIOS是PC LAN的通信接口标准,广泛适用于多种微机网络,使得以它为基础的设计和应用开发可移植性好.它不依赖于任何网络硬件,是一个介于网络硬件和用户应用程序之间的接口协议.其通信原理是:两个要进行通信的工作站通过名字建立一个虚电路,然后向相应的虚电路号发送或接收信息,这样通过虚电路实现了两个工作站之间的对等通信.利用NetBIOS实现工作站之间的实时通信,功能比较强,编程实现比较容易,所以应用比较广泛.第四种是通过TCP/IP协议来实现.下面我们将详细讨论各种技术的实现.

(一) 基于IPX/SPX 的实现技术

由于IPX/SPX不能支持多协议之间的通信,因此本文略之.

(二) 基于NetBIOS的编程接口

NetBIOS是Network Basic Input/Output System 的缩写,即网络基本输入输出系统,它是一种应用程序的接口.用户可以调用各种NetBIOS功能,而无需涉及到各种最低层的通信协议,从而实现数据源地与数据目的地之间的信息交换.

1 NetBIOS概述

NetBIOS是IBM公司于1984年首次推出的.它可以支持各种著名的通信协议,如TCP/IP,MAP/TOP,XNS,IEEE和OSI等,不仅适用于DOS环境,还可以用在UNIX,OS/2,WINDOWS环境.

NetBIOS作为一种网络支撑软件,在ISO的开放系统互联(OSI)模型中的位置如图3所示.

2 NetBIOS的基本概念

命令

NetBIOS的功能是由执行一系列命令来完成的.有Wait和No_wait两种形式.

名字

NetBIOS是一种按名字工作的系统,每一网络工作站和服务器都有一个(或几个)名字,每个节点还有一个永久节点名,它是在网络适配卡上的6字节网络地址前面再添上10个字节0构成.

数据报和会话

数据报是一种无连接的服务,即各个数据报之间互相独立,单独传送.在网络上任意两个名字之间可以建立一个会话,或多个会话.

网络控制块(NCB)

应用程序调用NetBIOS命令,必须先构造一块网络控制块(NCB),然后执行一次5CH中断.

信息帧

在网络中传递的信息是以帧的形式组织的.NetBIOS根据用户的命令,NCB以及它所知道的有关会话和名字的情况自动生成和管理信息帧,用户不必直接过问.

服务器报文块

3 NetBIOS设计要点

在设计两个或多个工作站之间对话的时候,要注意处理好以下几个问题:

1) 选择通信方式

网络中的通信可以采用数据报方式,也可以采用会话方式.

会话方式的特点是由通信协议保证每一报文能够正确地送到目的地.如果报文在传送过程中发生了差错,则通信协议会自动地进行重发,加以改正.而且,如果你发出的报文不止一个,那么通信协议还能够保证接收到的报文次序和发送时的次序一致.这些保证都是对用户应用程序透明地进行的,用户完全不需操心.但是,会话方式的主要缺点是过程比较复杂,在发送报文之前先要建立会话,送完报文之后又要撤除会话.因此,会话方式比较适合于点到点的多次往复式的对话.

数据报的特点正相反.它是把每一个报文作为一个独立的数据报处理,从而免除了建立和撤除会话的麻烦.但正因如此,它不能保证接收到的报文次序和发送次序一致,甚至不能保证每一个报文都能够正确无误地达到收方.在报文丢失或发生错误时,系统不向发送方提供出错信息.如果你所设计的对话环境由一系列互不相关的报文组成,或者每次对话都很简单,那么采用数据报传送可以大大加快对话的速度.另外,如果用数据报传送比较重要的报文,为了防止差错和丢失,可以在应用程序中为报文加上查错和序号功能.

2) 选择命令返回方法

执行NetBIOS命令可以采用等待方式和非等待方式.对于非等待方式,又可以有两种不同的做法:一种是轮询方法,即循环检查网络控制块(NCB)中的最终返回代码字段,当它的值从0xFF变为其它值时,表示该命令执行完毕. 另一种是异步事件处理方法,即告诉NetBIOS,在当前命令执行完毕后存放在NCB的POST程序地址字段中的程序指针,继续执行一个指定的程序段.需要指出的是,这两种做法虽然难易程度不同,但都是在后台进行.对于前后操作,都是立即返回用户程序,不必等待命令完成.它们的主要差别在于对网络负荷的影响.比如,一个工作站发出一条命令,要求另一个工作站执行一项比较费时的任务.如果这个工作站采用轮询方式,持续不断地询问对方是否完成,就会极大地增加网络的负荷.这时,尽管轮询比较容易编程,那也不是一种好的选择.

4 NetBIOS基本程序

1)调用NetBIOS

  要调用一NetBIOS功能,需要做以下三件事:

   (1) 构造一个NCB,包含所有需要告诉NetBIOS的信息.

#define USGC unsigned char

#define USGI unsigned int

#define USGL unsigned long

struct NCB  {

USGC NcbCommand;

USGC NcbRetCode;

USGC NcbLsn;

USGC NcbNum;

char * NcbBufferOffset;

USGI NcbBufferSegment;

USGI NcbLength;

char NcbCallName[16];

char NcbName[16];

USGC NcbRto;

USGC NcbSto;

char * NcbPostRtnOffset;

USGI NcbPostRtnSegment;

USGC NcbLanaNum;

USGC NcbCmdCplt;

char NcbReseredArea[14];

} ZeroNcb;

   (2) 把网络控制块地址写入ES:BX寄存器,作为指向该NCB的远程地址指针.

   (3) 执行5CH中断.执行中断时,NetBIOS自动进入ES:BX寄存器指定的地址,读出网络控制块,得知一切有关该操作的信息. 下面是设置指针和执行中断的程序段:

void NETBIOS  (struct NCB *NcbPtrNear)

{

union REGS InRegs,OutRegs;

struct NCB far *NcbPtrFar=(struct NCB far*)NcbPtrNear;

segread(&SegRegs);

SegRegs.es=FP_SEG(NcbPtrFar);

InRegs.x.bx=FP_OFF(NcbPtrFar);

int86x(NetbiosInt5c,&InRegs,&OutRegs,&SegRegs);

}

2)定义NetBIOS命令

在程序段中还包括对所有NetBIOS命令(包括WAIT和NO_WAIT)

3) POST程序

在执行非等待命令时,可以把一个POST程序的地址告诉NetBIOS,然后直接返回前台操作.当后台命令完成时,它会自动转去执行POST程序.从这段描述可以看出,我们必须把POST程序编成一个中断处理程序.

unsigned  es_reg,bx_reg,msg_received_flag;

NCB far *posted_ncb_ptr;

void interrupt POST (void)

{

  es_reg=_ES;

  bx_reg=_BX;

  posted_ncb_ptr=MK_FP (es_reg,bx_reg);

  msg_received_flag=TRUE;

}

4)数据报服务

假定A工作站和B工作站之间以数据报方式通信,其主要步骤如下:

  工作站A    工作站B

增加名字A   增加名字B

发送报文给B  ----------->   收到一个报文

收到一个报文 <------------  发送报文给A

删除名字A    删除名字B

5)会话服务

A工作站和B工作站之间以会话方式通信步骤如下:

  工作站A 工作站B

增加名字A    增加名字B

Listen   Call  A站

发送报文给B  ----------->   收到一个报文

收到一个报文 <------------  发送报文给A

Hang up  B站    Hang up  A站

删除名字A    删除名字B

  5 Windows 通信程序的特点

在Windows中,由于它是非抢先多任务,所以NetBIOS最好用异步方式(非等待式),CPU发出NetBIOS调用后,处理其他消息, 当NetBIOS完成后会自动执行后置例程POST, POST 通过 PostMessage 把一条用户定义的消息放到合适的队列中.Windows 应用程序接到该消息后再处理接收到的网络数据.

其次,由于Windows的代码段和数据段可移动,这对异步NetBIOS是致命的,当异步NetBIOS命令发出后,如果代码段或数据段移动,命令完成后,NCB所指示的缓冲区已发生变化.解决的方法是使代码段和数据段不可移动.在DEF文件中定义如下:

   CODE PRELOAD FIXED

   DATA PRELOAD FIXED SINGLE

6 点对点通信程序源代码. (基于NetBIOS)

完整的源程序见附录.

(三) 基于TCP/IP协议的编程接口

1 TCP/IP简介

TCP/IP的历史要追溯到70年代中期,当时ARPA为了实现异种网之间的互连(interconnection)与互通(intercommunication),大力资助网间网技术的研究和开发,于1977年到1979年推出目前形式的TCP/IP体系结构和协议规范.到今天,TCP/IP技术以及Internet网间网已经为广大计算机工作者,机算机厂商和机算机用户所接受.据统计,到1990年,Internet以包含遍布欧美的五千个活动网络,超过三十万台机算机.作为一种事实上的工标准,TCP/IP技术方兴未艾.

2 TCP/IP的网络分层结构

对TCP/IP协议来说,TCP提供传输层服务,IP提供网络层服务.TCP/IP协议组(或Internet协议组)的分层结构及其与OSI模型的对应关系如图4所示.图中有关协议的名称及其基本含义如下:

(1) TCP.  为传输控制协议(Transmission Control Protocol).它是提供给用户进程的一个可靠的全双工字节流的面向连接的协议.大多数Internet应用程序使用TCP.因为TCP使用IP,所以整个Internet协议组也常称为TCP/IP协议组.

(2) UDP. 为用户数据报协议 (User Datagram Protocol).

(3) ICMP. 为网间报文控制协议 (Internet Control Message Protocol).

(4) IP. 网间协议 (Internet Protocol). IP协议是为TCP,UDP和ICMP提供分组发送服务协议.

(5) ARP. 地址转换协议.

(6) RARP. 反向地址转换协议.

3 Socket编程界面

(1) Socket 原理

Socket编程界面由4BSD UNIX首先提出,目的是解决网间网进程通信问题.Socket接口为进程间通信提供了一种新的手段,它不但能用于同一机器中的进程之间的通信,而且支持网络通信功能.Socket具有类型,反应了对用户透明的通信特性.

一个完整的Socket连接用一个相关描述:

   { 协议,本地地址,本地端口,远地地址,远地端口 }

Socket 是面向客户-服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用.

(2) Socket系统调用

不管Socket内部机制如何,它提供给应用程序员的最终界面是一组系统功能调用.下面,我们一一给出重要的Socket系统调用.

   1. 创建 Socket ----- socket()

   调用格式如下:

   sockid = socket (af,type,protocol)

  af : 地址族,指本socket所用地址类型.

  type :  类型,指创建socket的应用程序所希望的通信服务器类型.

  protocol : 协议,指本socket请求的协议.

   2. 指定本地地址 ---- bind()调用

   bind()将本地socket地址与所创建的socket联系起来,即将本socket地址赋予socket,以指定本地半相关.bind()的作用相当于给socket命名,调用格式为:

   bind (sockid,localaddr,addrlen)

   sockid : socket号.

   localaddr : 本地socket地址.

   addrlen : 地址长度.

   3. 建立socket连接 ---- connect () 与 accept ()调用

   这两个系统调用用于完成整个相关的建立.其中connect用于建立连接 .调用格为:

   connect (sockid,destaddr,addrlen)

destaddr : 指向对方socket地址(信宿地址)结构的指针.

accept : 用于面向连接的服务器,其调用格式为:

   newsock = accept (sockid,clientaddr,paddrlen)

clientaddr : 指向客户socket地址指针.

paddrlen : 客户socket地址长度.

4. listen() 调用

   此调用用于面向连接服务器,表明它愿意接收连接,listen()在accept()之前调用,格式为:

listen (sockid,quelen)

  quelen : 请求队列长度.

5. 发送数据 ---- write(),writev(),send()与sendto(),sendmsg()

   用于socket数据发送的系统调用一共有五个,其中三个,write(),writev()和send()用于面向连接传输,其余两个用于无连接传输.面向连接的调用可以不指定信宿地址,而无连接的调用必须指定.假如无连接socket的双方均调用过connect(),可以认为是建立有连接的socket,也可以面向连接调用发送数据.

   三个面向连接调用三者的格式大致相同:

   write (sockid,buff,bufflen) : 缓冲发送

   writev (sockid,iovector,vectorlen) : 集中发送

   send (sockid,buff,bufflen,flags) : 可控缓冲发送

   其中buff指向发送缓冲区的指针,bufflen是发送缓冲区大小.

   用于无连接数据发送的调用有两个:

   sendto (sockid,buff,bufflen,flags,dsadd,addrlen)

   sendmsg (sockid,message,flags):可控集中无连接发送.

6. 接收数据 ---- read(),readv(),recv()与recvfrom(),recvmsg()

接收数据与发送数据系统调用是一一对应的,两者参数的最大区别是,前者buffer是一个指针,其所指单元初值为欲读数据长度,调用后的值是实际读出的值.

4 客户--服务器模型的Socket实现框架

   1)客户--服务器模型时序图

   下图是面向连接客户--服务器模型的典型时序图

服务器    客户

   socket()   socket()

bind() bind()

   listen()

  accept() 等待客户连接请求

阻塞   <━━━━━━━━━━━━━━━ connect()

   read() <━━━━━━━━━━━━━━━> write()

   2)服务器socket地址的确定

   在客户--服务器模型中,所有的作用者都是客户首先发起的(如连接请求,服务请求等),因此客户必须要知道服务器socket地址,另外,客户调用服务器之前,可以在命令行中给出服务器所在主机的域名,根据域名可以获得服务器主机的地址,系统调用为:hp=gethostbyname(host).其中host可以是服务器主机域名,返回hp是一个指向主机地址结构的指针.

五  结 论

综上所述,TCP/IP对于异种机具有极强的互连能力,很可能成为未来网络协议的标准,其通信编程有一整套方便实用的工具.因此,用其开发通信软件方便,容易,可升级.

而NetBIOS是一种可加载模块,其特点是可方便地实现不同协议之间的通信,其通用性极强,可方便地在不同局域网间移植.

以上两种方法各侧重点不同,而近年来由于Internet的兴起,TCP/IP逐渐变得重要了。TCP/IP使得互连UNIX终端,WINDOWS终端以至MAC终端成为现实。成为世界上最大的网络。目前,世界上各大公司正争先恐后的开发Internet上的资源.因此可以预见在不久的将来,以TCP/IP为基础的点点通信必将成为网络通信的重要手段.

  参 考 文 献

1. 顾隽修 等编著   <<计算机局域网络原理与应用>>   中国广播电视出版社   1993

2. 陈洛资 等编著   <<计算机网络软件设计,开发与编程>>   科学出版社 1994

3. 汤毅坚 编著   <<计算机实用网络编程>>   人民邮电出版社   1993

4. 张公忠 等编著  <<Novell 网组网原理与实用技术>>   清华大学出版社   1992

5. 徐建平 岳东 编著  <<Novell 网络原理,操作及开发指南>>  电子工业出版社  1994

6. 汤岳清 编著   <<Novell 网络及其互联技术>>   电子工业出版社   1992

7. 周明天 编著   <<TCP/IP网络原理,操作及开发指南>>   清华大学出版社   1993

8. Tim Farrell,Runnoe Connally  <<Windows 3.1 编程指南>>   清华大学出版社  1994

9. Daniel Appleman  <<Visual Basic 与 Windows API 接口大全>>   电子工业出版社  1995

10. 陈佳海 等编著   <<Visual C++ 程序开发指南>>   科学出版社  1995

11. 唐文卫 鲍敏   Novell 网上的点对点通信   <<微计算机应用>>   1995(6)

12. 邱勇攀   基于IPX的工作站实时通信的实现   <<微计算机应用>>   1995(2)

没有评论:

发表评论