引言
随着Internet的迅猛发展,网络通信应用程序的开发成为研究热点。Windows环境下进行通讯程序设计的基本方法是应用Windows Sockets实现进程间通讯。
1 TCP/IP协议、应用程序与套接字
TCP/IP协议是众多网络协议中比较完善的一种,它的部分是传输层协议(TCP,UDP)、网络协议层(IP)和物理接口层。 这三层通常在操作系统内核中实现。操作系统的内核是不能为用户所感受到的,一般用户感受到的只有应用程序。应用程序通过程序界面与操作系统内核打交道。TCP/IP网络环境下的应用程序是通过网络系统编程界面套接字Socket(在Windows操作系统下称之为WiNSock)来实现的。Socket构成了协议的用户视图。通过Socket,应用程序可访问通信协议。TPC/IP协议与应用程序之间的关系如图1.
图1 应用程序与Windows Sockets的关系
套接字(Socket)是网络通信的基本构件。套接字是可以被命名的通信端点,应用程序通过它在网络上发送和接收数据。每个套接字都有其类型,并有一个与之相连的进程。TCP/IP提供3种类型套接字:
1.1 流式套接字(SOCK—STREAM)
该接口提供一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。 内设流量控制,避免数据流超限;数据被看作字节流,无长度限制。流式套接字提供了一种可靠的面向连接的数据传输方式,如果想发送大批量数据或想让数据按顺序无重复地到达目的地,流式套接字为有用。本文使用流式套接字。
1.2 数据包套接字(SOCK—DGRAM)
该接口提供一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。数据包套接字比较适用于数据包或记录型数据的传输,数据包的发送不能得到保证,而且不能排序到达。
1.3 原始式套接字(SOCK—RAW)
该接口允许对较低层协议,如IP、ICMP直接访问。
套接字至少在客户机/服务器模式;点对点模式;远程程序调用(RPc)三种通信环境下广泛应用。
2 Windows Sockets介绍
Sockets初只是UNIX系统中的网络通信接口之一。1992年制定出Windows Sockets规范1.0版。 目前实际应用中的Windows Sockets规范主要有1.1版和2.0版,其中1.1版只支持TCP/IP协议,而2.0版支持多协议,并具有良好的向后兼容性。 Windows Sockets 是MicrosoftWindows的网络程序设计接口,使在Windows下开发高性能的网络程序成为可能。
Windows Sockets实现一般由两部分组成:开发组件和运行组件。 开发组件包括介绍WindowsSockets实现的文档、Windows Sockets应用程序接口(API)引入库和一些头文件。 运行组件是Windows Sockets应用程序接口的动态链接库(DLL),文件名为WINSOCK.DLL,应用程序在执行时通过装入它实现网络通信功能。
Windows Sockets是Berkelery Sockets 在Windows环境下的扩充[5],它为Windows下网络异步通信提供了一种方便的开发和运行环境,现在已经成为Windows标准下的网络程序设计接口,Windows下各种开发平台都支持Windows Sockets上的网络程序设计,提供了网络编程接口。
Windows Sockets API是Windows Sockets的网络程序接口,它包括一个标准的BerkelerySockets功能调用*,以及为Windows所作的扩充功能。 扩充功能的调用都冠以WSA(windowssockets asnchronous)前缀,表明它们都允许异步的I/O操作,并采用符合Windows消息机制的网络事件异步选择机制。这些扩充功能有利于开发者更好地利用Windows的消息驱动特性来设计出高性能的网络程序。
3 网络通信的实现
通过一个客户机/服务器模式的网络应用程序,实现对CSocket类的派生和应用为例介绍网络通信的实现。
3.1 客户机/服务器模式
数据集中管理需要融合各控制系统的不同数据,由于各控制系统连接在不同的网络上,要融合其中的实时信息需要解决异种网联的问题,而TCP/IP协议无疑是一个很好的选择。
对于各集中监测系统,与数据集中管理系统同在中央调度室,因此可以在遵循TCP/IP协议的局域网中进行实时通信。 在TCP/IP协议下利用Socket进行网络编程,自然就会涉及到C/S(客户机/服务器)模式,即客户端向服务器发出请求,服务器接收到请求后提供相应的服务。客户机/服务器模式在操作过程中采取的是主动请求方式。
3.1.1 服务器方
首先服务器方要启动,侦听客户方是否有连接请求,并根据请求提供相应服务:
1)打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接受客户请求,或者由开发人员自己指定端口地址;
2)等待客户请求到达该端口;
3)接收到重复服务请求时,处理该请求并发送应答信号。接收并发送服务请求,需要激活一个新进程来处理这个客户请求,并不需要对其他请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止;
4)返回第二步,等待另外的客户请求;
5)关闭服务器。
3.1.2 客户方
1)打开一通信通道,并连接到服务器所在的主机的特定端口;
2)向服务器发出服务请求报文,等待并接收应答,继续提出请求;
3)请求结束后关闭通信通道并终止。
从以上描述过程可以看出:客户机与服务器进程的作用是非对称的,因此编码不同,而且服务进程要先于客户请求启动。基于面向连接的Socket的客户机/N务器应用程序基本结构如图2.
图2 面向连接的套接字应用程序的时序
3.2 用Winsock进行网络编程
为了简化WinSock网络编程,使用户专注于应用程序算法的设计,Microsoft的基本类库(microsoft foundation class或MFC)提供了两种利用Windows Sockets进行网络通信的编程模式,这两种模式即为用CAsyncSocket类和派生于CAsyncSocket的CSocket类 来编程。这两个类在不同程度上对WinSock API的函数进行了封装,在编程时使用经过封装的MFC WinSock类使编程工作大大简化,而且,这两个类都提供了事件处理函数,通过对事件处理函数进行重载,用户可以在应用程序中很方便地对套接字发送、接收数据等事件进行处理。
CAsyncSocket类封装了Windows SocketsAPI函数,提供了较低层的与Windows Sockets对话接口,一般适合于有相当水平的网络编程基础者使用,可方便地进行底层的网络事件通知及信息回叫控制等操作。
3.2.1 程序设计思想
虽然MFC本身提供了CSocket类用于实现客户机与服务器之间的通信,但是为了增强程序的可 客户端也建立一个类CSocketClient用于与服扩展性和提高性能,在服务器端建立了 务器端通信,也继承自CSocket类。
ClisteningSocket类用于协议端口,通过对 CSocket类的listen()函数重载使得当客户端提出连接请求时,可以做出应答,同时建立了客户端类CClientSocket,它继承自CSocket类,通过重载Accept()函数与客户端建立连接,用于处理服务器客户端数据的发送和接收。
3.2.2 程序实现
服务器端Socket程序是在CSocketServer类中实现的,数据的接收和处理都是在这个类中实现的。
主要步骤如下:
1)服务器端创建Socket以及客户端创建Socke
在类ClisteningSocket中创建端口,一旦有数据到达它将通知Socket,实现如下:
2)客户端与服务器端的连接
当listen()函数到有客户端程序建立连接时,服务器端就新建一个CClientSocket用于与客户端进行数据交换传输,并把它链到链表的尾部,需要进行数据传输时通过链表进行连接,这样就可以实现一个服务器与多个客户端的连接,然后通过重载CSocket类的OnAccept()函数进行处理。服务器端程序如下:
当客户端需要与服务器通信时,客户端指定端口和服务器名,创建一个CSocketClient,如果连接成功,那么就用这个CSocketClient与服务器端进行通信,如果连接不成功,则删除这个建立的Socket,以节省资源。客户端程序还是在函数OnSetup()中实现,如下:
3)客户端与服务器端数据的处理
当需要进行数据接收时,是通过重载CSocket类的函数OnReceive()来实现的,用于显示给用户或是引发其它的动作。 服务器端程序如下:
其中函数DoProcessData为数据处理函数,对接收到的数据进行校验、解析后生成新的实时数据库类对象,存入动态数组中。
4)结束处理把所有不用的Socket删除,释放资源。
4 结束语
网络的优点使其应用逐渐广泛,利用网络互传信息进行技术开发的项目越来越多。WindowsSockets是Windows下的标准程序设计接口。
VC++环境下,利用MFC的CSocket类,派生出所需要的套接字,利用套接字建立连接、传输数据,对套接字事件进行处理,是一种简洁高效的网络编程方法。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。