论文部分内容阅读
一、问题的提出
随着网络技术的发展,一些应用系统如订票系统,期货系统等这些广域网络系统中具有实时性通信问题都提到了议事日程。由于广域网络系统的网络结构、传输介质等条件所限,在广域网络系统中很难实现实时通信,即使是提高其通信的速度也是很困难的。在实际工作中提高广域网络系统中的通信的速度问题,一般的方法是增加网络的带宽,减少拥塞,这是改变信息的基础设施来提高广域网络系统中通信速度的问题。本文所要讨论的问题是在信息的基础设施保持不变的前提下,解决如何提高广域网络系统中通信速度的问题。为了讨论方便,我们把广域网络系统中快速通信简称为准实时通信。借此说明我们在该文中讨论的广域网络系统的快速通信问题其快速性和可靠性。为此本文首先讨论广域网络系统准实时通信问题的概念,抽象出其数学模型,然后提出解决问题的方法。
在这里应用系统中的广域网络系统准实时通信是指:”整个应用系统是建立在广域网络系统基础之上;”系统中每条信息要求都具有严格的全局性和准实时性。事实上,可以将应用系统抽象为一个完全图加以说明。设Ai,Aj分别代表两个应用子系统(可以是LAN,也可以是一个远程工作站)。如果Ai,Aj有准实时会话要求,则我们说Ai与Aj关联,记作Ai\Aj ,于是该系统可以表示为图1示。这里Ai(i=0,1,.,N)代表N+1个应用子系统,分别异地相处,两两关联,由此构成具有准实时通信的广域网络系统。该系统的特点:①数据X0∈A0,如果X0是系统数据,则X0∈Ai(i=1,2,.,N),即X0属于整个系统B,这里B=∪Ai(i=0,1,.,N)。②系统数据X0在节点A0经过处理后变换为X′0,即X′0=P(X0)。由于X0∈A0,则X′0∈A0 ,由①可知X′0∈B且意义唯一。
二、socket网络通信
IBM公司于1994年4月推出的TCP/IPforDOSV2.1.1所提供的开发软件包Programmer'sToolKit不仅带有DOS下网络编程接口,而且提供了Windows 下网络异步通信接口WINSOCK。Socket有三种主要类型:stream sockets,datagramsockets 和raw sockets。Streamsocket接口定义了一种可靠的面向连接的服务,它实现了无差错无重复的顺序数据传输。它通过内置的流量控制解决了数据的拥塞,应用程序可以发送任意长度的数据,将数据当作字节流。Datagramsocket接口定义了一种无连接的服务,数据通过相互独立的包进行传输,包的传输是无序的,并且不保证是否出错、丢失和重复。包长度是有限的(隐含长度为8192 字节,最大长度可设为32768字节)。Raw socket接口允许对低层协议如IP和ICMP的直接存取,它主要用于新的网络协议实现的测试等。通过一个面向连接的传输发生的典型情况来说明socket网络通信的实现。由于客户机和服务器的关系不是对称的。服务器首先启动,然后在某一时间启动客户机与服务器建立连接。服务器和客户机开始都必须用调用socket()建立一个套(socket),然后服务器调用bind()将套接字与一个本地网络地址捆扎在一起,再用调用listen()使套接字处于一种被动的准备接收状态,同时规定它的请求队列长度,之后服务器就可以调用accept()来接收连接了。客户机在建立套接字之后,便可以通过调用connect()和服务器建立连接。连接建立后,客户机和服务器之间就可以通过连接发送和接收数据(调用read()和write())。最后,待数据传送结束,双方调用close()关闭套接字。
三、WINSOCK对Socket的扩充
BSD Socket支持阻塞(blocking)和非阻塞(non-blocking)两种工作方式。在阻塞方式下,connect()、accept()、read()和recv()等调用在执行时都处于阻塞状态直到它成功或出错返回。在非阻塞方式下,这些调用是立即返回的,但是它们是否完成得靠查询才能知道。对于Windows 这种非抢先多任务操作系统来说,这两种工作方式都是难以接受的,为此,WINSOCK 在尽量与BSD Socket保持一致的前提下,又对它作了必要的扩充。WINSOCK对BSDSocket的扩充主要是在基于消息、对网络事件的异步存取接口上。
WINSOCK的应用程序在使用上述WINSOCK函数前,必须先调用WSAStartup()函数对Windows Sockets DLL 进行初始化,以协商WINSOCK的版本支持,并分配必要的资源。在应用程序退出之前,应该先调用函数WSACleanup()终止对Windows Sockets DLL 的使用,并释放资源,以利下一次使用。
四、网络实时通信的实现
UNIX下基于BSD Socket的服务器程序和Windows 下基于WINSOCK的客户机程序之间的通信。服务器在主机UNIX下直接运行,前台和后台均可;客户机在Windows下运行,带一个参数,即主机的名字。先看客户机程序,首先定义几个宏、菜单资源和部分全局变量。
客户机程序的窗口主函数很简单,它在注册窗口类、建立窗口后,只是给主窗口函数发送一个用户消息,然后就进入Windows消息处理循环。
主窗口函数ClientProc是程序的主要部分,它处理相关的消息:在接到消息WM-USER后,它调用函数WSAStartup()初始化Windows Sockets DLL,并检查其版本号,然后通过主机名获取主机地址;在接到消息WM-COMMAND 时,如果是命令IDM-START,则调用子程序Client()建立套接字,并试图和服务器建立连接,如果是命令IDM-STOP,则调用函数WSACleanup()终止Windows Sockets DLL,并发出终止应用程序的消息;在接到消息UM-SOCK时,它根据参数lParam指示的网络事件,进行相应的操作,然后选择下一个期望的网络事件。
随着网络技术的发展,一些应用系统如订票系统,期货系统等这些广域网络系统中具有实时性通信问题都提到了议事日程。由于广域网络系统的网络结构、传输介质等条件所限,在广域网络系统中很难实现实时通信,即使是提高其通信的速度也是很困难的。在实际工作中提高广域网络系统中的通信的速度问题,一般的方法是增加网络的带宽,减少拥塞,这是改变信息的基础设施来提高广域网络系统中通信速度的问题。本文所要讨论的问题是在信息的基础设施保持不变的前提下,解决如何提高广域网络系统中通信速度的问题。为了讨论方便,我们把广域网络系统中快速通信简称为准实时通信。借此说明我们在该文中讨论的广域网络系统的快速通信问题其快速性和可靠性。为此本文首先讨论广域网络系统准实时通信问题的概念,抽象出其数学模型,然后提出解决问题的方法。
在这里应用系统中的广域网络系统准实时通信是指:”整个应用系统是建立在广域网络系统基础之上;”系统中每条信息要求都具有严格的全局性和准实时性。事实上,可以将应用系统抽象为一个完全图加以说明。设Ai,Aj分别代表两个应用子系统(可以是LAN,也可以是一个远程工作站)。如果Ai,Aj有准实时会话要求,则我们说Ai与Aj关联,记作Ai\Aj ,于是该系统可以表示为图1示。这里Ai(i=0,1,.,N)代表N+1个应用子系统,分别异地相处,两两关联,由此构成具有准实时通信的广域网络系统。该系统的特点:①数据X0∈A0,如果X0是系统数据,则X0∈Ai(i=1,2,.,N),即X0属于整个系统B,这里B=∪Ai(i=0,1,.,N)。②系统数据X0在节点A0经过处理后变换为X′0,即X′0=P(X0)。由于X0∈A0,则X′0∈A0 ,由①可知X′0∈B且意义唯一。
二、socket网络通信
IBM公司于1994年4月推出的TCP/IPforDOSV2.1.1所提供的开发软件包Programmer'sToolKit不仅带有DOS下网络编程接口,而且提供了Windows 下网络异步通信接口WINSOCK。Socket有三种主要类型:stream sockets,datagramsockets 和raw sockets。Streamsocket接口定义了一种可靠的面向连接的服务,它实现了无差错无重复的顺序数据传输。它通过内置的流量控制解决了数据的拥塞,应用程序可以发送任意长度的数据,将数据当作字节流。Datagramsocket接口定义了一种无连接的服务,数据通过相互独立的包进行传输,包的传输是无序的,并且不保证是否出错、丢失和重复。包长度是有限的(隐含长度为8192 字节,最大长度可设为32768字节)。Raw socket接口允许对低层协议如IP和ICMP的直接存取,它主要用于新的网络协议实现的测试等。通过一个面向连接的传输发生的典型情况来说明socket网络通信的实现。由于客户机和服务器的关系不是对称的。服务器首先启动,然后在某一时间启动客户机与服务器建立连接。服务器和客户机开始都必须用调用socket()建立一个套(socket),然后服务器调用bind()将套接字与一个本地网络地址捆扎在一起,再用调用listen()使套接字处于一种被动的准备接收状态,同时规定它的请求队列长度,之后服务器就可以调用accept()来接收连接了。客户机在建立套接字之后,便可以通过调用connect()和服务器建立连接。连接建立后,客户机和服务器之间就可以通过连接发送和接收数据(调用read()和write())。最后,待数据传送结束,双方调用close()关闭套接字。
三、WINSOCK对Socket的扩充
BSD Socket支持阻塞(blocking)和非阻塞(non-blocking)两种工作方式。在阻塞方式下,connect()、accept()、read()和recv()等调用在执行时都处于阻塞状态直到它成功或出错返回。在非阻塞方式下,这些调用是立即返回的,但是它们是否完成得靠查询才能知道。对于Windows 这种非抢先多任务操作系统来说,这两种工作方式都是难以接受的,为此,WINSOCK 在尽量与BSD Socket保持一致的前提下,又对它作了必要的扩充。WINSOCK对BSDSocket的扩充主要是在基于消息、对网络事件的异步存取接口上。
WINSOCK的应用程序在使用上述WINSOCK函数前,必须先调用WSAStartup()函数对Windows Sockets DLL 进行初始化,以协商WINSOCK的版本支持,并分配必要的资源。在应用程序退出之前,应该先调用函数WSACleanup()终止对Windows Sockets DLL 的使用,并释放资源,以利下一次使用。
四、网络实时通信的实现
UNIX下基于BSD Socket的服务器程序和Windows 下基于WINSOCK的客户机程序之间的通信。服务器在主机UNIX下直接运行,前台和后台均可;客户机在Windows下运行,带一个参数,即主机的名字。先看客户机程序,首先定义几个宏、菜单资源和部分全局变量。
客户机程序的窗口主函数很简单,它在注册窗口类、建立窗口后,只是给主窗口函数发送一个用户消息,然后就进入Windows消息处理循环。
主窗口函数ClientProc是程序的主要部分,它处理相关的消息:在接到消息WM-USER后,它调用函数WSAStartup()初始化Windows Sockets DLL,并检查其版本号,然后通过主机名获取主机地址;在接到消息WM-COMMAND 时,如果是命令IDM-START,则调用子程序Client()建立套接字,并试图和服务器建立连接,如果是命令IDM-STOP,则调用函数WSACleanup()终止Windows Sockets DLL,并发出终止应用程序的消息;在接到消息UM-SOCK时,它根据参数lParam指示的网络事件,进行相应的操作,然后选择下一个期望的网络事件。