当前位置:文档之家› 基于Socket的网络编程技术及其实现

基于Socket的网络编程技术及其实现

基于Socket的网络编程技术及其实现
基于Socket的网络编程技术及其实现

摘要

随着网络技术的飞速发展,计算机给人类文明带来了翻天覆地的变化,原来物理上的接口已不能满足网络通信的要求了。TCP/IP(Transmission Control Protocol/Internet Protocol)协议作为网络通信的基本协议就解决了这一通信难题,它引入了一种称之为“Socket”的应用程序接口。Socket 是建立在传输层协议上的一种套接字规范,基于Socket的网络编程已是一项现如今被广泛利用的技术,很大程度上方便了人们的生活。

本文以VC++6.0为开发环境,利用套接字的网络编程规范,实现运行不同桌面操作系统的计算机之间的相互监控的远程控制系统。该系统对远程主机的监控主要包括:实时监视桌面状态、修改系统配置文件、控制鼠标、键盘等基本操作。系统可以让本地计算机通过局域网访问不同的远程计算机,也可以进行网际主机控制。

本文首先针对远程控制系统的关键技术进行了深入研究,并对远程控制系统的做出了需求分析。设计了系统的基本框架和各个模块的功能,主要针对服务器模块,客户端模块,消息模拟模块等进行了具体实现。最后对系统进行了功能测试和性能分析,并得出所期望的测试结果。

关键字:Socket;VC++;网络编程;远程控制

Abstract

With the rapid development of network technology, computer has brought human civilization aundergone enormous changes, the original physical interface has been unable to meet the requirements of network communication. As the network communication protocol TCP / IP protocol solved the basic problem of this communication, the introduction of a technique called "Socket" application program interface. Socket network based on programming is a widely utilized nowadays .

In this paper, VC 6.0 development environment, socket-based network programming, implementation and process control system that allows the local computer through the LAN to access different remote computers, and its operation can also be carried out Internet host.

This article first briefly introduces the remote desktop monitoring system key technologies, as well as system requirements analysis. The basic framework of the system design and function of each module; then introduces the various functional modules of the specific implementation steps. Finally, test methods and results, the advantages and disadvantages of the system are summarized.

Keywords:Socket;VC++;Network Programming;Remote Control

目录

1 绪论 (1)

1.1 课题的背景和意义 (1)

1.2 课题的国内外研究现状 (1)

1.3 课题的结构安排 (2)

2 Socket网络编程的关键技术 (3)

2.1 Socket网络编程理论基础 (3)

2.1.1 OSI七层网络模型与TCP/IP四层网络模型 (3)

2.1.2 Socket编程基本原理 (6)

2.2 Windows Socket网络编程技术 (10)

2.2.1 Winsock简介 (10)

2.2.2 Winsock通信机制 (10)

2.2.3 Winsock编程模型 (11)

2.3 图像技术 (13)

2.4 图像压缩编码解码 (16)

2.4.1 霍夫曼压缩 (17)

2.4.2 Run Length压缩 (17)

3 远程控制系统总体设计 (19)

3.1 系统需求分析 (19)

3.1.1 用户需求 (19)

3.1.2 可采用的技术方案 (19)

3.2 可行性技术方案 (19)

3.2.1 技术可行性 (19)

3.2.2 经济可行性 (20)

3.3 系统的基本框架 (20)

3.4 模块划分及功能设计 (21)

4 系统的详细设计与实现 (22)

4.1 界面设计 (22)

4.1.1 客户端界面 (22)

4.1.2 服务器端界面 (24)

4.2 客户端模块设计与实现 (25)

4.3 服务器模块设计与实现 (27)

4.4 消息模拟功能的实现 (29)

4.5 流数据的实现 (30)

4.6 图形编码 (30)

5 系统实施及测试 (34)

5.1 测试环境搭建 (34)

5.2 系统功能和性能测试 (34)

5.2.1 客户端显示测试 (34)

5.2.2 鼠标键盘功能测试 (39)

5.3 测试结果 (42)

结论 (43)

致谢 (44)

参考文献 (45)

附录A 英文原文 (47)

附录B 中文翻译 (58)

附录C 源程序 (65)

1 绪论

1.1 课题的背景和意义

随着计算机网络技术的发展,原来物理上的接口(如键盘、鼠标、网卡、显示卡等输入、输出接口)已不能满足网络通信的要求了。TCP/IP协议作为网络通信的基本协议就解决了这一通信难题。TCP/IP协议集成到操作系统的内核中,在TCP/IP协议中引入了一种称之为“Socket”的应用程序接口。Socket 是建立在传输层协议是TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)上的一种套接字规范,它最初由美国加州Berkley大学提出,是UNIX 操作系统开发的网络通信接口,它定义了两台计算机间的通信规范(也是一种编程规范)。如果两台计算机是利用一个“通道”进行通信,那么这个“通道”的两端就是套接字。Socket 屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP 协议软件和实现了Socket 规范的计算机之间的通信成为可能。Socket接口是TCP/ IP 网络最为通用的API(Application Program Interface),也是在Internet 上进行应用开发最通用的API。

1.2 课题的国内外研究现状

基于Socket的网络编程技术在人们不断的研究和探索下,日益的完善与成熟,已被广泛的应用在通信,医疗等各个领域。比如市面上比较普遍的QQ、UC、飞鸽传书等以内部网络为中心的资源共享系统,都应用到套接字网络编程技术。

目前,常用的Socket类型有两种,流式Socket(SOCK_STREAM)和数据报式Socket (SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用,实现了无差错无重复的顺序数据传输,无长度限制;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用,定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠。在现在的网络应用中,通信双方最常见的交互模式便是Client/ Server 模式。客户/ 服务器模式通常采用监听/ 连接的方式实现,服务器端应用程序在一个端口监听对服务的请求。也就是说,服务进程一直处于休眠状态,直到有一个客户对这个服务提出了连接请求,此时服务线程被“唤醒”并为客户。

目前,大多数远程进程间通信代码是用Socket 编写的,实际应用中用Socket 传输信息并不是独立的,它在多线程的处理环境中应用更为广。

1.3 课题的结构安排

第1章论述了Socket网络编程的的研究背景和意义,Socket网络编程技术的国内外研究现状。

第2章论述了Socket网络编程的关键技术:网络编程的理论基础,Windows Socket 网络编程技术,图像技术,图像压缩的编码及解码,包括霍夫曼压缩,和Run Length(行程长度)压缩等。

第3章对系统进行了总体设计。总体设计包括需求分析、可行性技术方案,框架结构、模块划分以及模块的功能定义。

第4章给出了系统详细的设计和具体实现。详细设计包括了界面设计,客户端模块设计与实现,服务器模块设计与实现,消息模拟功能的实现,流数据的实现,图形编码等。

第5章对系统进行了测试,包括测试的环境、过程和测试结论。

2 Socket网络编程的关键技术

2.1 Socket网络编程理论基础

2.1.1 OSI七层网络模型与TCP/IP四层网络模型

1、OSI网络分层参考模型

网络协议设计者不应当设计一个单一、巨大的协议来为所有形式的通信规定完整的细节,而应把通信问题划分成多个小问题,然后为每一个小问题设计一个单独的协议,这样做使得每个协议的设计、分析、时限和测试比较容易。协议划分的一个主要原则是确保目标系统有效且效率高。为了提高效率,每个协议只应该注意没有被其他协议处理过的那部分通信问题;为了主协议的实现更加有效,协议之间应该能够共享特定的数据结构,同时这些协议的组合应该能处理所有可能的硬件错误以及其它异常情况。为了保证这些协议工作的协同性,应当将协议设计和开发成完整的、协作的协议系列(即协议簇),而不是孤立地开发每个协议。

在网络历史的早期,ISO(国际标准化组织)和国际电报电话咨询委员会(CCITT)共同出版了开放系统互联的七层参考模型。计算机操作系统中的网络过程包括从应用请求(在协议栈的顶部)到网络介质(底部),OSI参考模型如图2.1把功能分成七个分立的层次。

第一层:物理层,负责最后将信息编码成电流脉冲或其它信号以用于网上传输。它由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态、时钟要求、数据编码、数据传输用的连接器。

第二层:数据链路层,通过物理网络链路提供可靠的数据传输。不同的数据链路层定义了不同的网络和协议特征,其中包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。

第三层:网络层,负责在源点和终点之间建立连接。它一般包括网络寻径、流量控制、错误检查等。相同MAC(Media Access Control)标准的不同网段之间的数据传输一般只涉及到数据链路层,而不同的MAC标准之间的数据传输都涉及到网络层。例如IP路由器工作在网络层,因而可以实现多种网络间的互联。

第四层:传输层,向高层提供可靠的端到端的网络数据流服务。传输层的功能一般包括流控、多路传输、虚电路管理及差错校验和恢复。流控管理设备之间的数据传输,

确保传输设备不发送比接收设备处理能力大的数据;多路传输使得多个应用程序的数据可以传输到一个物理链路上;虚电路由传输层建立、维护和终止;差错校验包括为检测传输错误而建立的各种不同结构;而差错恢复包括所采取的行动(如请求数据重发),以便解决发生的任何错误。传输控制协议(TCP )是提供可靠数据传输的TCP/IP 协议族中的传输层协议。

第五层:会话层,建立、管理和终止表示层与实体之间的通信会话。

第六层:表示层,提供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息可以被另一个系统应用层识别。表示层的编码和转化模式包括公用数据表示格式、性能转化表示格式、公用数据压缩模式和公用数据加密模式。

第七层:应用层,最接近终端用户的OSI 层,这就意味着OSI 应用层与用户之间是通过应用软件直接相互作用的。应用层的功能一般包括标识通信伙伴、定义资源的可用性和同步通信。因为可能丢失通信伙伴,应用层必须为传输数据的应用子程序定义通信伙伴的标识和可用性。定义资源可用性时,应用层为了请求通信而必须判定是否有足够的网络资源。在同步通信中,所有应用程序之间的通信都需要应用层的协同操作。

2.1 七层网络模型

2、TCP/IP四层网络模型

TCP/IP分层模型(TCP/IP Layening Model)被称作因特网分层模型(Internet Layering Model)、因特网参考模型(Internet Reference Model)。

TCP/IP协议被组织成四个概念层,其中有三层对应于ISO参考模型中的相应层。ICP/IP协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能,必须与许多其他的协议协同工作。

TCP/IP分层模型的四个协议层分别完成以下的功能:

第一层:网络接口层,包括用于协作IP数据在已有网络介质上传输的协议。实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能。相反,它定义像地址解析协议(Address Resolution Protocol, ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口。

第二层:网间层,对应于OSI七层参考模型的网络层。本层包含IP协议、RIP协议(Routing Information Protocol,路由信息协议),负责数据的包装、寻址和路由。同时还包含网间控制报文协议(Internet Control Message Protocol, ICMP)用来提供网络诊断信息。

第三层:传输层,对应于OSI七层参考模型的传输层,它提供两种端到端的通信服务。其中TCP协议提供可靠的数据流运输服务,UDP协议提供不可靠的用户数据报服务。

第四层:应用层,对应于OSI七层参考模型的应用层和表达层。因特网的应用层协议包括Finger、Whois、FTP(文件传输协议)、Gopher、HTTP(超文本传输协议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)、IRC(因特网中继会话)、NNTP (网络新闻传输协议)等。图2.2为TCP/IP四层模型。

图2.2 TCP/IP四层模型

2.1.2 Socket编程基本原理

1、套接字介绍

套接字(Socket)起初来源于UNIX,是加利福尼亚大学Berkeley 分校开发的UNIX 操作系统下的网络通信接口。当TCP/IP协议被集成到UNIX内核中时,相当于在UNIX 系统引入了一种新型的I/O操作,UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多,因此引入了套接字作为通信端口,随着UNIX 操作系统的广泛使用,Socket 亦当之无愧的成为了最流行的网络通信程序接口之一。

套接字存在于其特定的通信域(即地址族)中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念,只有隶属于同一地址族的套接字才能建立对话(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),Windows Sockets V1.0 目前只支持网际域(AF_INET),所有使用网际协议簇的进程均适用于该域。一般情况下除非通信协议支持,只有相同类型的套接字方能相互传递数据,Windows Sockets V1.1 版主要支持两种类型的套接字:流式套接字和数据报套接字,还有一种是原始套接字,但为保证网络应用程序的兼容性,一般不鼓励使用原始套接字。

流式套接字(SOCK_STREAM):该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务。而且发送的数据是按顺序接收的。所有利用该套接字进行传递的数据均被视为连续的字节流的并且无长度限制。这对数据的稳定性、正确性和发送/接收顺序要求严格的应用十分适用,TCP协议使用该类接口。但其对线路的占用率相对提高。流式套接字的实现屡见不鲜,如远程登录(TELNET)、文件传输协议(FTP)等均使用了流式套接字。

数据报式套接字(SOCK_DGRAM):数据报式套接字提供了面向无连接的服务, 它独立的数据包形式发送数据(数据包长度不能大于32KB),不提供正确性检查,也不保证各数据包的发送顺序,因此,可能出现数据的重发、丢失等现象,并且接收顺序由具体路由决定。然而,数据报的实现对网络线路占用率较低。NFS(网络文件系统)即是采用此类套接字、在TCP/IP 协议族中,UDP使用该类接口。

原始套接字(SOCK_RAW):该套接字一般不会出现在高级网络接口的实现中,因为它是直接针对协议的较低层(如IP、TCP、UDP 等)直接访问的。常用于检验新的协议实现或访问现有服务中配置的新设备,如前所述,一般不提倡他的直接应用。2、套接字编程基本概念

进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,

为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD中的管道(pipe)、命名管道(named pipe)和软中断信号(signal),UNIX system V的消息(message)、共享存储区(shared memory)和信号量(semaphore)等,但都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。

为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。

为了解决上述问题,TCP/IP协议引出了几个概念。

(1)端口

网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。

按照OSI七层协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进程。

端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,端口的操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问。

类似于文件描述符,每个端口都拥有一个叫端口号(port number)的整数型标识符,用于区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。

端口号的分配是一个重要问题。有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合适的系统调用将自己

与该端口号联系起来(绑扎)。TCP/IP端口号的分配中综合了上述两种方式。TCP/IP 将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口(即周知口,well-known port),即使在不同的机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP和UDP 均规定,小于256的端口号才能作保留端口。

(2)地址

网络通信中通信的两个进程分别运行在不同的机器上。在互连网络中,两台机器可能位于不同的网络,这些网络通过网络互连设备(网关,网桥,路由器等)连接。因此需要三级寻址:

a. 某一主机可与多个网络相连,必须指定一特定网络地址;

b. 网络上每一台主机应有其唯一的地址;

c. 每一主机上的每一进程应有在该主机上的唯一标识符。

通常主机地址由网络ID和主机ID组成,在TCP/IP协议中用32位整数值表示;TCP 和UDP均使用16位端口号标识用户进程。

(3)网络字节顺序

不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节(低价先存),有的存高位字节(高价先存)。为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式,它们均含在协议头文件中。

(4)连接

两个进程间的通信链路称为连接。连接在网络中表现为一些缓冲区和一组协议机制,在外部表现出比无连接高的可靠性。

(5)半相关

综上所述,网络中用一个三元组可以在全局唯一标志一个进程:(协议,本地地址,本地端口号)

这样一个三元组,叫做一个半相关(half-association),它指定连接的每半部分。

(6)全相关

一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远地地址,远地端口号)

这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。

(7)顺序

在网络传输中,两个连续报文在端-端通信中可能经过不同路径,这样到达目的地时的顺序可能会与发送时不同。“顺序”是指接收数据顺序与发送数据顺序相同。TCP协议提供这项服务。

(8)流控制

在数据传输过程中控制数据传输速率的一种机制,以保证数据不被丢失。TCP协议提供这项服务。

2、服务方式

在网络分层结构中,各层之间是严格单向依赖的,各层次的分工和协作集中体现在相邻层之间的界面上。“服务”是描述相量相邻层之间关系的抽象概念,即网络中各层向紧邻上层提供的一组操作。下层是服务提供者,上层是请求服务的用户。服务的表现形式是原语(primitive),如系统调用或库函数。系统调用是操作系统内核向网络应用程序或高层协议提供的服务原语。网络中的n层总要向n+1层提供比n-1层更完备的服务,否则n层就没有存在的价值。

在OSI的术语中,网络层及其以下各层又称为通信子网,只提供点到点通信,没有程序或进程的概念。而传输层实现的是“端到端”通信,引进网间进程通信概念,同时也要解决差错控制,流量控制,数据排序(报文排序),连接管理等问题,为此提供不同的服务方式:

面向连接(虚电路)或无连接

面向连接服务是电话系统服务模式的抽象,即每一次完整的数据传输都要经过建立连接,使用连接,终止连接的过程。在数据传输过程中,各数据分组不携带目的地址,而使用连接号(connect ID)。本质上,连接是一个管道,收发数据不但顺序一致,而且内容相同。TCP协议提供面向连接的虚电路。

无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不能保证分组的先后顺序,不进行分组出错的恢复与重传,不保证传输的可靠性。UDP协议提供无连接的数据报服务。

2.2 Windows Socket网络编程技术

2.2.1 Winsock简介

为了方便网络编程,Microsoft联合了其他几家公司共同制定了一套Windows下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket 实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输和接收的信息都通过这个Socket接口来实现。

Winsock规范定义了一套可使网络程序开发人员在Windows下开发标准的TCP/IP 网络程序接口,它不仅包含人们所熟悉的Berkeley Socket风格的库函数,还包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制、异步网络事件选择方式进行编程。Winsock规范定义并记录了任何使用API与Internet通讯协议(ISP通常指TCP/IP)连接。应用程序使用Windows Sockets的API,而Windows Sockets又利用下层的网络通信协议与操作系统以产生实际的通信。

2.2.2 Winsock通信机制

应用程序的网络通信归根结底是利用相同的通信协议来完成信息的传输,应用程序和Winsock都工作在Windows的用户模式下,操作系统仅仅通过Winsock是不能完成网络间的通信,还需要底层的支持,而套接字仿真器(套接字核心模式驱动程序)和传输驱动程序接口(Transport Driver Interface,TDI)是负责操作系统核心态环境下的网络通信,起到了Winsock和传输协议之间的通信桥梁作用。如图2.2所示,Winsock是网络通信应用程序于套接字仿真器间的接口,TDI是套接字仿真器和传输协议间的接口套接字核心模式,驱动程序复杂连接和缓冲区管理,以便向应用程序提供套接字仿真(在AFDSYS文件中实现),同时负责与底层传输驱动程序对话传输驱动程序接口(TDI)负责核心模式驱动程序与传输协议间的通信。

当应用程序利用Winsock发送和接收数据时,并不是由Winsock从网络上发送和接收数据的,而是由核心模式驱动程序AFDSYS负责管理发送和接收缓冲区来发送和接收数据。也就是说,当应用程序调用send或WSASend函数来发送数据时,AFDSYS将

把数据复制进他自己的发送缓冲区,然后send后WSASend函数立即返回AFDSYS在后台负责把数据发送出去,远程客户端接收数据的情况也类似,由接收方的AFDSYS 在后台负责把数据复制到自己的接收缓冲区,然后当应用程序调用recv后WSARecv函数来接收数据时,把数据由AFDSYS管理的接收缓冲区复制到应用程序提供的缓冲区中。AFDSYS管理的发送缓冲区SO-SNDBUF和接收缓冲区SO-RCVBUF在缺省时两个缓冲区的大小都为8192个字节,但可以根据实际要求由应用程序设定,由于我们传输的对象可能是大数据量文件,因此需要对系统的发送缓冲区和接收缓冲区作相应的设定,以保障大数据量的文件数据的发送和接收。

Sockets的实质是通信端点的一种抽象,它提供一种发送和接受数据的机制。根据通信性质不同可分为:Stream Sockets(流式套接字)和Datagram Sockets(数据报套接字),其中Stream Sockets提供无差错的、面向连接的、无长度限制的双向字节流传输,适应于处理大量数据,尤其适合于FTP服务。

图2.2 套接字通信机制

2.2.3 Winsock编程模型

1、建立一个Socket

Winsock函数含有三个参数,“协议簇”参数指明像TCP/IP协议组这样的一组相关协议,“Socket类型”参数指明参数指明程序是进行数据报传输还是字节流传输,“协议”参数定义了协议簇内程序欲使用的具体协议(如TCP或UDP)。

由于编程时必须指定程序使用的协议簇,因而能够为使用不同协议组和地址格式的网络建立相同的接口。也就是说,本函数的正确调用可使Winsock接口运行在多个网络上。下面语句显示了一个典型的具体Winsock函数调用:

Socket_handle=Socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);

这个Winsock使用Internet协议簇(PF_INET)的TCP协议(IPPROTO_TCP)进行字节流(SOCK_STREAM)通信。当程序调用Winsock函数建立一个新Socket时,Winsock将为一个内部数据结构分配内存,此结构中保存有关此Socket的信息。

2、配置一个Socket

程序可使用Winsock中不同的函数来配置一个Socket。每个Socket需要五种信息:本地和远地本机的IP地址、本地和远地进程的协议端口、连接使用的协议。

面向连接的协议在连接端点之间建立一条虚电路,面向连接的客户程序不必关心网络软件使用怎样的本地地址传输数据。建立好连接后,客户程序依靠TCP协议给它传送数据。因此面向连接的客户程序不需指明本地协议端口,它提供给Socket的唯一地址信息是远地服务器信息(IP地址和协议端口)。Winsock自动保存本地IP地址和选择本地协议端口,并确保客户程序收到传输层送给本地协议端口的所有数据。也就是说,Winsock为程序选择协议端口,当数据到达此端口时通知程序,程序不必关心Winsock 使用哪一个协议端口。

在前一步已建立的Socket基础上,面向连接的客户程序使用connect函数来配置Socket。

result=connect(“Socket句柄”,“远地Socket地址”,“远地Socket地址长度”);

此时,内部数据结构就包含了网络通信必须的五种信息。只有面向连接的客户进程才启动与远地服务器Socket的直接连接。

无连接协议不建立与远地服务器的直接连接。使用无连接协议的客户程序必须发送一个带有服务请求的数据报并等待应答,远地服务器的应答以数据报的形式到达。Winsock用bind函数给Socket指定一个本地IP地址和一个协议端口,其典型调用如下:result=bind(“Socket句柄”,“本地Socket地址”,“本地Socket地址长度”);

服务器程序使用bind函数用Winsock登记一个协议端口,程序告诉Winsock监视哪一个协议端口的数据传送,Winsock接着告诉传输层将此协议端口收到的数据传送给Winsock。

3、使用Socket

使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作

系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。

应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。

Closesocket函数用来关闭一个描述符为s套接字。由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构。当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。

Closesocket函数如果执行成功就返回0,否则返回SOCKET_ERROR。

服务程序可以调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将维护一个客户连接请求队列,该队列最多容纳backlog个客户连接请求。假如该函数执行成功,则返回0;如果执行失败,则返回SOCKET_ERROR。

服务程序调用accept函数从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,以后与客户套接字交换数据的是新创建的套接字;如果失败就返回INVALID_SOCKET。该函数的第一个参数指定处于监听状态的流套接字;操作系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用第三个参数来返回新创建的套接字的地址结构的长度。

2.3 图像技术

Windows系统不允许应用程序直接访问视频存储区,而是提供了一个抽象的接口,称作图形设备接口(GDI)。Windows已经提供了各种显示卡的驱动程序,这样我们的程序就不用关心与系统相连的显示卡的类型,可以通过调用GDI函数来和硬件打交道。

各种GDI函数会自动参考被称为设备环境的数据结构。Windows会自动将设备环境结构映射到相应的物理设备,并且提供正确的输入输出指令,GDI在处理速度上几乎和直接进行视频访问一样快。BMP图形文件是Windows采用的图形文件格式,在Windows 环境下运行的所有图像处理软件都支持BMP图像文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图像文件格式称为设备相关位图(DDB)格式。Windows 3.0以后的BMP图像文件与显示设备无关,因此把这种BMP图像文件格式称为设备无关位图(DIB)格式。位图文件可看成由4个部分组成;位图文件头(bitmap-fileheader)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列。

(1)BMP文件头

BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。其结构定义如下:

typedefstruct tagBITMAPFILEHEADER

{

WORD bfrype;∥位图文件的类型,必须为BM

DWORD bfSize;∥位图文件的大小,以字节为单位

WORD bIRescrvcdl;∥图文件保留字,必须为0

WORD bIReserved2;∥位图文件保留字,必须为0

DWORD bfOffBits;∥位图数据的起始位置,以相对于位图文件头的偏移量表示,单位是字节

}BITMAPFILEHEADER;

(2)BMP位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息,其结构定义如下:typedefstruct tagBITMAPINFOHEADER{

DWORD biSize;∥结构所占用字节数

LONG biWidth;∥位图的宽度,以像素为单位

LONG biHeight;∥位图的高度,以像素为单位

WORD biplanes;∥目标设备的级别,必须为l

WORD biBitCount;∥每个像素所需的位数,必须是l(双色),4(16色),8(256色)或24(真彩色)之一

DWORD biCompression;∥位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或2(BI RLE4压缩类型)之一

DWORD biSizeImage;∥位图的大小,以字节为单位

LONG biXPelsPerMeter;∥位图水平分辨率。每米像素数

LONG biYPelsPerMeter;∥位图垂直分辨率,每米像素数

DWORD biClrUsed;∥位图实际使用的颜色表中的颜色数

DWORD biClrImportant;∥位图显示过程中重要的颜色数

}BITMAPINFOHEADER;

(3)调色板(颜色表)

调色板用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD 类型的结构,定义一种颜色。ROBQUAD结构的定义如下:

typedefstruct tagRGBQUAD{

BYTE rgbBlue;∥蓝色的亮度(值范围为0~255)

BYTE gbGreen;∥绿色的亮度(值范围为0~255)

BYTE rgbRed;∥红色的亮度(值范围为0~255)

BYTE rgbReserved;∥保留,必须为0

}RGBQUAD;

颜色表中RGBQUAD结构数据的个数由biBitCount来确定:

●当biBitCount=1,4,8时,分别有2,16,256个表项;

●当biBitCount=24时,没有颜色表项。

位图信息头和颜色表组成位图信息,B1TMAPINFO结构定义如下:

typcdefstruct tagBITMAPINFO{

BITMAPINFoHEADER bmiI-Ieader;∥位图信息头

RGBQUAD bmiColors;∥颜色表

}BITMAPINFO;

(4)位图数据

位图数据记录了位图的每一个像素值,记录顺序是扫描行内从左到右,扫描行之问从下到上。位图的一个像素值所占的字节数:

●当biBitCount=1时,8个像素占1个字节;

●当biBitCount=4时,2个像素占1个字节;

●当biBitCount=8时,1个像素占1个字节;

●当biBitCount=24时,1个像素占3个字节。

Windows规定下个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。一个扫描行所占的字节数计算方法:

DataSizePerLin=(biWidth*biBitCount+31)/8;∥一个扫描行所占的字节数

DataSizePcrLincr=DataSizePerLine/4*4;∥字节数必须是4的倍数位图数据的大小(不压缩情况下)

DataSize=DataSizePerLine*biHeight;

2.4 图像压缩编码解码

位图原稿数字化后的数据量非常惊人,在硬盘上存储时颇占地盘,并给传输带来了很多不便,所以图像压缩得到了广泛的运用。压缩的目的就是满足存储容量和传输带宽的要求,而付出的代价是大量的计算。图像数据压缩技术总的来说就是利用图像数据固有的冗余性和相干性,将一个大的数据文件转换成较小的同性质的文件。

图像压缩主要根据两个基本事实来实现。一是图像数据中有许多重复的数据,使用数学方法来表示这些重复数据就可以减少数据量;二是人的眼睛对图像细节和颜色的辨认有一个极限,把超过极限的部分去掉,也就达到了压缩数据的目的。利用前一个事实的压缩技术就是无损压缩技术,即压缩后的图像数据还原后与未压缩时严格相同,没有失真,如TIFF图像文件格式;利用后一个事实的压缩技术就是有损压缩技术,即压缩后的图像数据与未压缩时有所不同,但不影晌人们对原始资料表达的信息造成误解,如JPEG图像文件格式。实际的图像压缩其实是综合使用各种有损和无损压缩技术来实现的。

采取有损压缩的方法进行数据压缩,在解压时会造成较大的误差扩。所以本系统采用的数据压缩方式是无损压缩。

图像压缩编码对图像采用不同的表达方式以减小表示图像所需的数据量,所以也常称为数据压缩。压缩的理论基础是信息论。从信息论的角度来看,压缩就是去掉信息中的冗余,即保留不确定的信息,去掉确定的信息(可推知的),也就是用一种更接近信息本质的描述来代替原有冗余的描述。这个本质的因素就是信息量(即不确定因素)。

假如用n1和n2分别代表用来表达相同信息的2个数据集合中的信息载体单位的个

相关主题
文本预览
相关文档 最新文档