某学校机房管理系统的设计与实现.doc_第1页
某学校机房管理系统的设计与实现.doc_第2页
某学校机房管理系统的设计与实现.doc_第3页
某学校机房管理系统的设计与实现.doc_第4页
某学校机房管理系统的设计与实现.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

某学校机房管理系统的设计与实现某学校机房管理系统的设计与实现 摘摘 要要 为提高机房使用效率,净化上机环境,杜绝个别用户使用机房内电脑做违 规的事情,为机房管理员提供一个好的机房监控系统是必要的。作者在对机房 微机管理过程进行了详细调查后,参考了一些网吧的微机管理系统,获得了机 房监控系统的设计思路。机房管理系统应当能使管理员极其方便的获取某台微 机的屏幕视图,锁定某台电脑的键盘和鼠标输入,并能发送消息给指定的电脑 用户。 本论文从理论上分析了实现机房监控系统所需要的基础技术的原理,并以 vc+6.0 作为开发工具,在 win32 平台下实现了一个机房监控系统。论文第二 部分简述了 tcp/ip 协议以及 socket 编程技术,第三部分讲述了系统的设计目 标和通信协议,第四章则介绍了实现过程中使用的核心技术,包括屏幕截图、 锁定屏幕以及服务器端和客户端的通信。通过本文的研究,为机房监控系统的 设计和实现展示了一个完整的方案,具有一定参考价值。 关键词关键词:机房监控系统;屏幕截图;锁定屏幕;socket the design and implementation of the computer room monitor and control system abstract it is necessary to provide a computer room monitor and control system with good quality so that the users will obey the room rules and the room can work effectively in a steady environment. after analyzing the process of the computer room management and studying some cyber-cafe management system, the concept framework of the computer room monitor and control system was gained. at least, the monitor system must provide abilities to snap the screen of the computer specified by the manager, to disabled the input function of the keyboard and the mouse and to send messages to the computer users. this article enumerated the technologies needed for the implementation of the monitor system and introduced in detail about the issue that how to build a win32 executable system by using the vc+6.0 as the development tools. in this article, the 2nd chapter introduced the tcp/ip protocol and the socket programming; the 3rd chapter described the design goals and the communication protocol; the 4th chapter covered the technology cores of the monitor and control system, which were screen snapping, screen locking and communication between server and client. this article advanced a complete solution for the design and implementation of the computer room monitor system and the solution will be reference for similar applying. key words: computer room monitor system; snap screen; lock screen; socket 目目 录录 论文总页数:31 页 1 引言.1 1.1 课题背景 1 1.2 内容介绍 1 2 相关技术原理介绍.1 2.1 tcp/ip 协议.1 2.1.1 tcp/ip 协议简介.1 2.1.2 tcp 协议.2 2.1.3 ip 协议.3 2.1.4 tcp/ip 模型.3 2.2 socket技术.6 2.2.1 socket 基本概念.6 2.2.2 socket 类型及规范.7 2.2.3 win socket api8 2.3 win32 编程技术13 3 系统的设计14 3.1 系统设计目标 14 3.2 系统架构设计 14 4 系统的实现18 4.1 用户界面的实现 18 4.2 核心算法的实现 20 4.2.1 客户端和服务器端的通信.20 4.2.2 屏幕截图20 4.2.3 锁屏和解屏22 结 论 .24 参考文献 .25 第 1 页 共 30 页 1 1 引言引言 1.11.1 课题背景课题背景 当今时代是一个信息种类多元化,信息量巨大化,传播速度急速化的时代。 要积极面临这种现状,就要能快速的处理各种信息,从而引申出人们对信息处 理工具的高度关注。而各种电子设备,尤其是电脑等硬件设备的出现,给人们 的日常生活带来极大的变化。随着计算机网络的出现,更使得人们的信息处理 方式发生了革命性的改变。毫无疑问,计算机以及由计算机组成的计算机网络 已经成为当今时代最佳的信息处理工具。掌握这个工具对于科研和学习有着重 要意义。 鉴于这种情况,现在许多学校都提供了微机室,让在校学生可以很好的学 习计算机操作,并使用计算机辅助学习。对于同学们来说,这本来是个很好的 机会,但有个别同学未能珍惜这个机会,他们没有好好利用这些微机进行学习 和研究,而是在机房内打游戏或者闲聊等,甚至有人利用电脑进行违反法规的 活动。这些同学不但浪费了自身的学习机会,同时也浪费了学校的宝贵资源, 而且给周围的同学造成了很不好的影响。因此,如何对机房进行有效的管理成 为了一个不容忽视的问题。 对于机房管理,一方面应该设立专门的管理员,拟定详细的机房使用规则; 另一方面,也应该配备强大的管理软件,辅助管理员进行管理。因此,如何设 计和实现机房监控系统成为了本次课题的研究问题。 1.21.2 内容介绍内容介绍 文章在第二章介绍了一些基本的技术原理,涉及到 tcp/ip 协议、socket 技术、win32 编程等概念,这些都是实现机房监控系统的基础技术。在第三章, 首先讨论了机房监控系统应该具备哪些功能,接着设计出了服务器端和客户端 器的通信协议。在第四章,首先讲述了用户界面的实现,接着着重介绍了几个 核心技术的实现,包括如何对某个特定客户端进行屏幕截图,如何锁定指定客 户端的屏幕以及如何在服务器端和客户端的进行通信。 2 2 相关技术原理介绍相关技术原理介绍 2.12.1 tcp/iptcp/ip 协议协议 .1 tcp/iptcp/ip 协议简介协议简介 所谓协议是一套用技术术语描述某些事物应该如何做的规则。如果执行不 同的协议(一方知道某事的概念,但另一方却不知道) ,那么他们会因各自的协 议无法沟通而完不成有用的工作。在计算机网络领域中,为了完成一项任务, 所涉及的两个(或多个)通信实体必须运行同样的协议。 internet 是 由众多的计算机网络交错连接形成的网际网,作为 internet 第 2 页 共 30 页 成员的各种网络在通讯中分别执行自己的协议。所谓 internet 协议是指在 internet 的网络之间以及各成员网内部交换信息时要求遵循的协议。在 internet 中,到处运行着协议,凡是涉及两个或多个远程实体的通信活动均由 协议来支配。协议定义了两个或多个通信实体间所交换消息的格式与顺序,以 及在发出和/或收到一个消息或者发生其他事件所采取的行动。tcp/ip 是 internet 网络上使用的通用协议。internet 依靠上千个网络和百万计的计算机, 而 tcp/ip 是把它们合在一起的粘结剂。 tcp/ip 的目标是提供高速网络通信链路。tcp/ip 的实际名字来源于两个最 重要的协议:tcp 协议与 ip 协议,其中传输控制协议 tcp 对应于开放系统互联 0si 参考模型的传输层协议;网络连接协议 ip 则对应于 osi 参考模型的网络层 协议。所以 tcp/ip 分别是 internet 在传输层和网络层执行的协议。 .2 tcptcp 协议协议 tcp 协议是互联网传输层协议。tcp 服务模型包括面向连接的服务和可靠的 数据传输服务,调用 tcp 作为其传输协议的应用同时取得这两种服务。总体来 说,tcp 保证递送全部数据,但对递送速率和所经历的延迟不加保证。电子邮 件、远程终端访问、web 和文件传送都使用 tcp。这些应用选择 tcp 的主要原因 在于 tcp 提供可靠的数据传输服务,能够保证所有数据最终到达其目的地。 tcp 的传输实体一般为软件实现:一部分是用户进程,一部分是操作系统的 部分核心(管理 tcp 字节流,实现与 ip 层的接口) 。tcp 的传输服务是通过在 收发双方创建套接字 socket 来实现的;socket 的地址是通过 ip 地址与端口号 来标识的。每条 tcp 的传输连接用发送端套接字、接收端套接字来表示,是点 到点的全双工通道(全双工支持同时的双向传输)运行与 tcp 上的应用程 序包括 ftp、http、smtp 和 telnet。 在 internet 内部,从主机传送到主机的信息不是一个恒定的流,而是把数 据分解成小包,即数据包。例如你要发一分很长的电子邮件(e-mail)给一位朋 友,tcp 就将该信息分成很多个数据包,每一个数据包用一序号和接收地址来 标记。此外 tcp 还插入一些纠错信息。接着数据包被传过网络,即把它们传送 给远程的主机这就是 ip 的工作。在另一端 tcp 接收数据并检查错误。如果有错 误发生,tcp 就可以要求重发信息。换句话说,ip 的工作是把原始数据(数据包)从 一端传送到另一端;tcp 的工作就是管理这种流动并确保其数据是正确的。把数 据分解成数据包有很多的好处。首先,它允许 internet 让很多不同的用户在同 一时间用同一通讯线路。因为这些数据包不必一起输送,所以通讯线路可以载 着所有类型的数据包按它们自己的路径从一地到另一地。就如同一条高速公路 上,各类汽车(即使它们开向不同的地方)都在公共道路上行驶。当数据包传 第 3 页 共 30 页 输时,它们沿规定的路由从主机到主机,一直到它们到达最终目的地。这意味 着 internet 很具灵活性。如果一个特定的连接中断了,控制数据流动的计算机 通常可以找到另一条路由。事实上,在单一数据传输中,多个数据包完全可能 沿不同的路由传输。当条件改变时,网络可获得当时最好的连接。如当网络的 某一部分过载,数据包可以改变路线去走那些比较空闲的线路。用数据包传输 的另一个好处是,当某处出错,只须重新传送单个数据包,而不是整个信息。 这样会大大加快 internet 的传输总速度。这种灵活性产生很高的可靠性。 internet 运行非常好,虽然所有数据包都必须通过很多计算机,但它可以用几 秒钟就把一个文件从一主机传输到另一主机,尽管它们相距很远。 .3 ipip 协议协议 网际网络协议(ip)用于数据报交换网络互连系统种,是 tcp/ip 协议堆栈所 采用的传输协议。ip 协议的基本数据形态是数据元(datagram) ,一般都成为 数据报,此协议提供了从来源主机到目的主机之间数据报的传输机制。ip 数据 报中携带这来源地址和目的地址,利用这些地址数据,可将数据报传输到目的 主机。ip 协议具有数据报分割以及重组机制,需要的时候可以将数据报作适当 的分割以及重组,以便能够在网络中传输。 ip 协议是网络层协议,它是一种不可靠的,无连接导向的协议,无论是端 对端或者路由器对路由器,都不提供可靠的传输,也不会提供确认信息,除了 报头校验和外,ip 协议本身没有数据的错误控制机制,一旦数据发生错误或者 未能完整的接收,都不能重传。甚至即使是只有一个字节发生错误或者没有收 到,也必须将整个数据报都丢弃。虽然,ip 协议提供了数据报的传输机制,但 是并没有提供传输的可靠性、流量控制、顺序性服务机制,它所提供的只是最 佳化的传输服务。 .4 tcp/iptcp/ip 模型模型 习惯上,人们把 internet 的通讯协议笼统地称为 tcp/ip 协议,也有人把 internet 称为 tcp/ip 网或 tcp/ip internet 网。在这种意义下,internet 的 tcp/ip 协议可以说就是基于四种模型的协议:即应用层、传输层、网络层和网 络访问层。其中网络访问层又分为网络接口层(链路层)和最基础的物理层。所 以也可以说 internet 的网络协议是基于五层模型的协议。 根据 tcp/ip 协议,互联网分为 4 层,加上最底层的硬件层一共是 5 层 第 4 页 共 30 页 应用层(第五层) 传输层(第四层) 网络层(第三层) 链路层(第二层) 物理层(第一层) 图 2-1 tcp/ip 协议分层 1)物理层: 物理层的任务是把帧中的各位从一个节点移往下一个节点。这一层的协议 也取决于链路,而进一步取决于链路真正的传输介质。 物理层提供了一个基本机制:对二进制数据(比特)进行编码(发送到物 理介质)和解码(从物理介质接收) ,例如 10mbit/s(bit/s 指比特每秒)以太 网的曼彻斯特编码、光纤分布式数据接口(fiber distributed data interface,简称 fddi)的 4b/5b 编码;物理层也负责通知第二层(链路层) 何时访问介质。物理层以比特流的方式传送来自链路层的数据,而不理会数据 的含义或格式;同样,它接收数据以后,不加分析直接传给链路层。 物理层也定义与介质的物理连接机制,但不是介质本身,按照参考模型的 原理,实际的物理介质在物理层之下。 2)链路层: 链路层的任务是把完整的帧从一个网络组建移往某个紧邻的组件,负责管 理数据格式。它定义了将数据组成正确帧的规程和在网络中传输帧的规程,帧 是指一串数据,它是数据在网络中传输的单位。网络层在源端和目的端之间经 由一系列分组交换机(路由器)路由分组。为了将一个分组从一个节点(主机 或分组交换机)移往其路径上的下一个节点,网络层必须依赖由链路层提供的 服务。链路层提供了对链路的管理,链路层提供的服务取决于应用在链路上的 特定链路层协议。分组从源端到目的端一般需要经过多个链路,每个分组沿其 路径到达不同链路是,可能有不同的链路层协议来处理。既是说,ip 从不同的 链路层协议获取的服务会不一样。 链路层负责监督相邻网络节点的信息流动,它使用检错或纠错技术来确保 正确的传输:当链路检测到错误时,它请求重发,或是根据情况纠正。此外, 链路层还要解决流量控制的问题。 3)网络层: 网络层提供越过多个网络的选路功能,为端点提供无连接的数据报访问, 并定义端到端通过整个互联网网络的寻址功能。网络层负责寻址、打包以及从 第 5 页 共 30 页 一台计算机通过一个或多个路由器到最终目标的包转发机制。网络层的核心协 议有:ip、arp/rarp、icmp 和 igmp。ip 协议(internet protocol,简称 ip) 是 tcp/ip 模型的核心,它是一个路由协议,负责 ip 寻址、路由选择、分段及 包重组。 4)传输层: 传输层给应用提供在其客户端和服务器之间传输应用层消息的服务。即传 输层负责为两个用户进程之间建立、管理和拆除可靠而又有效的端到端连接。 传输层的核心协议是传输控制协议 tcp(transmission control protocol)和 用户数据报协议 udp(user datagram protocol) 。tcp 给其应用提供面向连接 的服务,该服务包括应用层消息往目的地有保证的递送以及流量控制(既发送 端和接收端之间速度的匹配) 。tcp 还把长数据块分割成较小的段,并提供拥塞 控制机制。这样当网络处于拥塞状态时,源端会抑制其发送速率。udp 协议给 其应用提供无连接的服务,是一个几乎没有任何修饰的服务。 5)应用层: 应用层负责支持网络应用,直接与用户或应用程序通信,它给应用程序提 供访问其他层服务的能力并定义应用程序用于交换数据的协议。应用层包括许 多协议,例如支持 web 的 http、支持文件传送的 ftp、支持电子邮件的 smtp 协议都建立在这一层。 tcp/ip 应用程序使用的应用层接口有 windows 套接字(winsock) 、 netbios 等。windows 套接字提供 windows 下的标准应用编程接口;netbios 是 工业标准接口,用于访问协议服务,如会话、数据报和名字解析等。 internet 的核心层是网络层和传输层,相应的核心协议是 ip 协议和 tcp 协议。ip 协议的主要功能包括无连结数据报传送数据报寻径以及差错处理三 部分。ip 协议的特点是点到点的,ip 对等实体间的通信不经过中间机器,对等 实体所在的机器位于同一物理网络,对等机器之间有直接的物理连接。ip 层的 主要功能是屏蔽下面物理层的差别,向上一层提供一致的数据格式。所有要传 输的数据,被按照一定的格式分组封装层 ip 数据报,数据报单元通过寻径等机 制进行传输,在接收方数据报进行重组,得到最初要传送的数据。由于 ip 协议 是不可靠的数据传输协议,由于网络的拥塞而发生的数据丢失等情况是不可避 免的,因此 internet 还必须有一定的控制重传机制,这就是差错与控制报文 协议(icmp)。 尽管计算机通过安装 ip 软件,从而保证了计算机之间可以发送和接收数据, 但 ip 协议还不能解决数据分组在传输过程中可能出现的问题。因此,若要解决 可能出现的问题,还需要 tcp 协议来提供可靠的并且无差错的通信服务。tcp 第 6 页 共 30 页 协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作 用:当一台计算机需要与另一台远程计算机连接时,tcp 协议会让它们建立一 个连接、发送和接收数据以及终止连接。传输控制协议 tcp 协议利用重发技术 和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的 各种变化。即使在 internet 暂时出现堵塞的情况下,tcp 也能够保证通信的 可靠。互联网是一个庞大的国际性网络,网路上的拥挤和空闲时间总是交替不 定的,加上传送的距离也远近不同,所以传输数据所用时间也会变化不定。tcp 协议具有自动调整“超时值“的功能,能很好地适应 internet 上各种各样的变 化,确保传输数值的正确。 ip 协议只保证计算机能发送和接收分组数据,而 tcp 协议则可提供一个可 靠的、可流控的、全双工的信息流传输服务。虽然 ip 和 tcp 这两个协议的功能 不尽相同,也可以分开单独使用,但它们是在同一时期作为一个协议来设计的, 并且在功能上也是互补的。只有两者的结合,才能保证 internet 在复杂的环 境下正常运行。凡是要连接到 internet 的计算机,都必须同时安装和使用这 两个协议,因此在实际中常把这两个协议统称作 tcp/ip 协议。 2.22.2 socket 技术技术 .1 socketsocket 基本概念基本概念 20 世纪 80 年代初,美国政府的高级研究机构(arpa)给加利福尼亚大学 berkeley 分校提供资金,让他们在 unix 操作系统下实现 tcp/ip 协议。在这个 项目中,研究人员为 tcp/ip 网络通信开发了 api(应用程序接口) 。这个 api 称为 socket 接口。如今 socket 接口是 tcp/ip 网络最为通用的 api,也是在 internet 上进行应用开发最为通用的 api。 internet 是有不同种类的网络互连而成,实现不同网络及计算机之间交互 操作的关键问题是由 tcp/ip 协议来解决的。tcp/ip 协议的核心是传输层协议 (tcp 和 udp) 、网络层协议(ip)和网络接口层,前两层在操作系统内核中实 现。操作系统内核是不能直接为一般用户所感受到的,一般用户感受到的只有 应用程序(包括系统应用程序) ,即各种应用程序构成了操作系统的用户视图。 两者之间的接口是网络编程界面(程序员界面) 。因此,tcp/ip 网络环境下的 应用程序也不是直接与 tcp/ip 核心打交道,而是与网络应用编程接口(套接字, socket)打交道,编程接口构成了核心协议的用户视图。 实际上,socket 在计算机中提供了一个通信端口,可以通过这个端口与任 何一个具有 socket 接口的计算机通信。应用程序在网络上传输,接收的信息都 通过这个 socket 接口来实现。在应用开发中,就像使用文件句柄一样,可以对 socket 句柄进行读、写操作。可以把 socket 看成是一根连接线,当在两台计 第 7 页 共 30 页 算机之间建立了一个 socket 之后,两台计算机就可以通过这根连接线来完成信 息交互,所做的仅仅是向这根连接线里写入数据,再从其中读出数据,而不必 担心会不会由信息丢失,socket 会负责照看好数据。 socket 用于表达两台机器之间的连接终端 。一个网络应用涉及两台 (或两台以上)不同主机中跨网络彼此通信的两个进程。这两个进程通过经由 各自的套接字(socket)发送和接收消息彼此通信。对于一个给定的连接,每 台机器上都有一个套接字。有点像我们打电话,用电缆把电话连接起来,中间 的物理结构和具体实现过程我们不必了解,只要我们能进行通话即可。套接字 是单台主机内应用层和传输层之间的接口。套接字也用于指代应用程序和网络 之间的应用程序接口(application program interface,简称 api) ,因为它 又是用于构造互联网中的网络应用程序的编程接口。当我们进行编程时,需要 用到 socket 接口,socket 接口定义了许多函数或例程,我们可以直接调用它 们实现网络连接、通信等功能。socket 接口为我们建立通信信道,我们可以通 过这条通道来与一台或多台计算机进行连接。 套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了 tcp 协议软件和实现了套接字规范的计算机之间的通信成为可能。对于应用程 序来说,它就像一个服务协议插座一样,各种不同的协议,对应不同的端口。 我们可以把套接字看作相应进程上的“门”:进程把消息发送到网络或从 网络接收消息都得经过自身得套接字。当一个进程想给另一台主机中的另一个 进程发送消息是,它就把该消息推出自家的门。该进程认定在这扇门的另一侧 有一个传输设施会把这个消息传输到目的进程的门口。在服务器进程处于运行 状态的情况下,客户进程就能够初始化一个到服务器的 tcp 连接了,这是通过 在客户程序中创建一个套接字对象来完成的,当客户创建了它的套接字对象的 时候,它详细说明了服务器进程的地址,也就是,服务器的 ip 地址和进程的端 口号,一旦创建了套接字对象,客户端的 tcp 就发起一个三次握手,并建立一 个和服务器的 tcp 连接,三次握手对客户和服务器程序来说是完全透明的。 .2 socketsocket 类型及规范类型及规范 可以提供给用户使用的套接字有两种,它们分别是数据报套接字和流式套 接字: 1)流式套接字(socket_stream) 提供了面向连接、双向可靠的数据流传输服务,数据无出错,无重复地发 送且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流, 无长度限制。 流式套接字使用传输控制协议(tcp) 。它提供了一种可靠的,面向连接的 第 8 页 共 30 页 数据传输方式。通常基于连接的流式套接字是设计客户机/服务器应用程序时的 标准。流式套接字主要用于大批量数据或者让数据按顺序无重复的到达目的地 而使用 2)数据报式套接字(socket_dgram) 提供了无连接服务。数据包以独立形式被发送,不提供无错保证,数据可 能丢失或者重复,并且接收顺序无序。数据报套接字使用用户数据报协议 (udp) 。实际使用中,同一个分组数据报可能不止一次的被发送,一般要等到 接收方发回确认收到的消息才会停止发送。 一般有两种套接字规范:一种是针对 unix 系统的 berkely socket 规范; 一种是占主流地位的 windows sockets(简称 winsock)规范,它是 microsoft 以 berkely socket 规范为范例开发的 windows 下的网络编程接口。 windows socket 规范定义并记录了如何使用 api 与 internet 协议相连接, 且所有的 windows socket 实现都支持流式套接字和数据报套接字。应用程序调 用 windows socket 的 api 实现相互之间的通信。windows socket 又利用下层 的网络通信协议功能和操作系统调用实现实际的通信工作。 .3 winwin socketsocket apiapi 本文在软件实现上使用的 socket 函数正是 windows socket api。下面介 绍几个重要的 api: 一) wsastartup 函数 int wsastartup( word wversionrequested, lpwsadata lpwsadata ); 使用 socket 的程序在使用 socket 之前必须调用 wsastartup 函数。该 函数的第一个参数指明程序请求使用的 socket 版本,其中高位字节指明副 版本、低位字节指明主版本;操作系统利用第二个参数返回请求的 socket 的版本信息。当一个应用程序调用 wsastartup 函数时,操作系统根据请求 的 socket 版本来搜索相应的 socket 库,然后绑定找到的 socket 库到该应 用程序中。以后应用程序就可以调用所请求的 socket 库中的其它 socket 函 数了。该函数执行成功后返回 0。 例:假如一个程序要使用 2.1 版本的 socket,那么程序代码如下 wversionrequested = makeword( 2, 1 ); err = wsastartup( wversionrequested, 第 9 页 共 30 页 二) wsacleanup 函数 int wsacleanup (void); 应用程序在完成对请求的 socket 库的使用后,要调用 wsacleanup 函数 来解除与 socket 库的绑定并且释放 socket 库所占用的系统资源。 三) socket 函数 socket socket( int af, int type, int protocol ); 应用程序调用 socket 函数来创建一个能够进行网络通信的套接字。第 一个参数指定应用程序使用的通信协议的协议族,对于 tcp/ip 协议族,该 参数置 pf_inet;第二个参数指定要创建的套接字类型,流套接字类型为 sock_stream、数据报套接字类型为 sock_dgram;第三个参数指定应用程序 所使用的通信协议。该函数如果调用成功就返回新创建的套接字的描述符, 如果失败就返回 invalid_socket。套接字描述符是一个整数类型的值。每 个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符 和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描 述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可 以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套 接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。下面是一 个创建流套接字的例子: struct protoent *ppe; ppe=getprotobyname(“tcp“); socket listensocket=socket(pf_inet,sock_stream,ppe-p_proto); 四) closesocket 函数 int closesocket( socket s ); closesocket 函数用来关闭一个描述符为 s 套接字。由于每个进程中都 有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系 统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个 套接字数据结构。套接字数据结构中专门有一个字段存放该结构的被引用次 数,即有多少个套接字描述符指向该结构。当调用 closesocket 函数时,操 作系统先检查套接字数据结构中的该字段的值,如果为 1,就表明只有一个 套接字描述符指向它,因此操作系统就先把 s 在套接字描述符表中对应的那 条表项清除,并且释放 s 对应的套接字数据结构;如果该字段大于 1,那么 操作系统仅仅清除 s 在套接字描述符表中的对应表项,并且把 s 对应的套接 字数据结构的引用次数减 1。 closesocket 函数如果执行成功就返回 0,否则返回 socket_error。 第 10 页 共 30 页 五) send 函数 int send( socket s, const char far *buf, int len, int flags ); 不论是客户还是服务器应用程序都用 send 函数来向 tcp 连接的另一端 发送数据。客户程序一般用 send 函数向服务器发送请求,而服务器则通常 用 send 函数来向客户程序发送应答。该函数的第一个参数指定发送端套接 字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个 参数指明实际要发送的数据的字节数;第四个参数一般置 0。这里只描述同 步 socket 的 send 函数的执行流程。当调用该函数时,send 先比较待发送 数据的长度 len 和套接字 s 的发送缓冲区的长度,如果 len 大于 s 的发送缓 冲区的长度,该函数返回 socket_error;如果 len 小于或者等于 s 的发送 缓冲区的长度,那么 send 先检查协议是否正在发送 s 的发送缓冲中的数据, 如果是就等待协议把数据发送完,如果协议还没有开始发送 s 的发送缓冲中 的数据或者 s 的发送缓冲中没有数据,那么 send 就比较 s 的发送缓冲区的 剩余空间和 len,如果 len 大于剩余空间大小 send 就一直等待协议把 s 的 发送缓冲中的数据发送完,如果 len 小于剩余空间大小 send 就仅仅把 buf 中的数据 copy 到剩余空间里(注意并不是 send 把 s 的发送缓冲中的数据传 到连接的另一端的,而是协议传的,send 仅仅是把 buf 中的数据 copy 到 s 的发送缓冲区的剩余空间里) 。如果 send 函数 copy 数据成功,就返回实际 copy 的字节数,如果 send 在 copy 数据时出现错误,那么 send 就返回 socket_error;如果 send 在等待协议传送数据时网络断开的话,那么 send 函数也返回 socket_error。要注意 send 函数把 buf 中的数据成功 copy 到 s 的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上 被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那 么下一个 socket 函数就会返回 socket_error。 (每一个除 send 外的 socket 函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕 才能继续,如果在等待时出现网络错误,那么该 socket 函数就返回 socket_error) 注意:在 unix 系统下,如果 send 在等待协议传送数据时网络断开的话, 调用 send 的进程会接收到一个 sigpipe 信号,进程对该信号的默认处理是 进程终止。 六) recv 函数 int recv( socket s, char far *buf, int len, int flags ); 不论是客户还是服务器应用程序都用 recv 函数从 tcp 连接的另一端接 收数据。该函数的第一个参数指定接收端套接字描述符;第二个参数指明一 第 11 页 共 30 页 个缓冲区,该缓冲区用来存放 recv 函数接收到的数据;第三个参数指明 buf 的长度;第四个参数一般置 0。这里只描述同步 socket 的 recv 函数的 执行流程。当应用程序调用 recv 函数时,recv 先等待 s 的发送缓冲中的数 据被协议传送完毕,如果协议在传送 s 的发送缓冲中的数据时出现网络错误, 那么 recv 函数返回 socket_error,如果 s 的发送缓冲中没有数据或者数据 被协议成功发送完毕后,recv 先检查套接字 s 的接收缓冲区,如果 s 接收 缓冲区中没有数据或者协议正在接收数据,那么 recv 就一直等待,只到协 议把数据接收完毕。当协议把数据接收完毕,recv 函数就把 s 的接收缓冲 中的数据 copy 到 buf 中(注意协议接收到的数据可能大于 buf 的长度,所 以在这种情况下要调用几次 recv 函数才能把 s 的接收缓冲中的数据 copy 完。 recv 函数仅仅是 copy 数据,真正的接收数据是协议来完成的) ,recv 函数 返回其实际 copy 的字节数。如果 recv 在 copy 时出错,那么它返回 socket_error;如果 recv 函数在等待协议接收数据时网络中断了,那么它 返回 0。 注意:在 unix 系统下,如果 recv 函数在等待协议接收数据时网络断开 了,那么调用 recv 的进程会接收到一个 sigpipe 信号,进程对该信号的默 认处理是进程终止。 七) bind 函数 int bind( socket s, const struct sockaddr far *name, int namelen ); 当创建了一个 socket 以后,套接字数据结构中有一个默认的 ip 地址和 默认的端口号。一个服务程序必须调用 bind 函数来给其绑定一个 ip 地址和 一个特定的端口号。客户程序一般不必调用 bind 函数来为其 socket 绑定 ip 地址和断口号。该函数的第一个参数指定待绑定的 socket 描述符;第二 个参数指定一个 sockaddr 结构,该结构是这样定义的: struct sockaddr u_short sa_family; char sa_data14; ; sa_family 指定地址族,对于 tcp/ip 协议族的套接字,给其置 af_inet。当对 tcp/ip 协议族的套接字进行绑定时,我们通常使用另一 个地址结构: struct sockaddr_in short sin_family; 第 12 页 共 30 页 u_short sin_port; struct in_addr sin_addr; char sin_zero8; ; 其中 sin_family 置 af_inet;sin_port 指明端口号;sin_addr 结构体 中只有一个唯一的字段 s_addr,表示 ip 地址,该字段是一个整数,一般用 函数 inet_addr()把字符串形式的 ip 地址转换成 unsigned long 型的整 数值后再置给 s_addr。有的服务器是多宿主机,至少有两个网卡,那么运 行在这样的服务器上的服务程序在为其 socket 绑定 ip 地址时可以把 htonl(inaddr_any)置给 s_addr,这样做的好处是不论哪个网段上的客户程 序都能与该服务程序通信;如果只给运行在多宿主机上的服务程序的 socket 绑定一个固定的 ip 地址,那么就只有与该 ip 地址处于同一个网段 上的客户程序才能与该服务程序通信。我们用 0 来填充 sin_zero 数组,目 的是让 sockaddr_in 结构的大小与 sockaddr 结构的大小一致。下面是一个 bind 函数调用的例子: struct sockaddr_in saddr; saddr.sin_family = af_inet; saddr.sin_port = htons(8888); saddr.sin_addr.s_addr = htonl(inaddr_any); bind(listensocket,(struct sockaddr *) 服务程序可以调用 listen 函数使其流套接字 s 处于监听状态。处于监 听状态的流套接字 s 将维护一个客户连接请求队列,该队列最多容纳 backlog 个客户连接请求。假如该函数执行成功,则返回 0;如果执行失败, 则返回 socket_error。 九) accept 函数 socket accept( socket s, struct sockaddr far *addr, int far *addrlen ); 服务程序调用 accept 函数从处于监听状态的流套接字 s 的客户连接请 求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户 套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,以 后与客户套接字交换数据的是新创建的套接字;如果失败就返回 invalid_socket。该函数的第一个参数指定处于监听状态的流套接字;操作 第 13 页 共 30 页 系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用第三 个参数来返回新创建的套接字的地址结构的长度。下面是一个调用 accept 的例子: struct sockaddr_in serversocketaddr; int addrlen; addrlen=sizeof(serversocketaddr); serversocket=accept(listensocket,(struct sockaddr *) 十) connect 函数 int connect( socket s, const struct sockaddr far *name, int namelen ); 客户程序调用 connect 函数来使客户 socket s 与监听于 name 所指定的 计算机的特定端口上的服务 socket 进行连接。如果连接成功,connect 返 回 0;如果失败则返回 socket_error。下面是一个例子: struct sockaddr_in daddr; memset(void *) daddr.sin_family=af_inet; daddr.sin_port=htons(8888); daddr.sin_addr.s_addr=inet_addr(““); connect(clientsocket,(struct sockaddr *) 2.32.3 win32win32 编程技术编程技术 win32 是指 window 都是 32 位的操作系统,例如 98、xp、2000、2003 等操 作系统, win32 编程就是在这些系统下的编程,运用 window 提供的 api(application programming interface)为 window 编写应用程序。 win32 编程可以用 c 来完成,主要是通过 windows 的 api 来工作。然而更方便的是使 用 mfc,微软基础类(microsoft foundation classes),实际上是微软提供的,用 于在 c+环境下编写应用程序的一个框架和引擎,vc+是 windows 下开发人员使 用的专业 c+ sdk(sdk, standard software develop kit,专业软件开发平台), mfc 就是挂在它之上的一个辅助软件开发包,mfc 作为与 vc+血肉相连的部分, 可以大大方便程序员,简化程序员的工作。 mfc 是 win api 与 c+的结合,api,即微软提供的 windows 下应用程序的编 程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用 户使用各种各样的第三方的编程语言来进行对 windows 下应用程序的开发,使这 第 14 页 共 30 页 些被开发出来的应用程序能在 windows 下运行,比如 vb, vc+, java, delphi 编程语言函数本质上全部源于 api,因此用它们开发出来的应用程序都能工作在 windows 的消息机制和绘图里,遵守 windows 作为一个操作系统的内部实现。上 面说到 mfc 是微软对 api 函数的专用 c+封装,这种结合一方面让用户使用微软 的专业 c+ sdk 来进行 windows 下应用程序的开发变得容易,因为 mfc 是对 api 的封装,微软做了大量的工作,隐藏了好多内节程序开发人员在 windows 下用 c+ / 屏幕和内存设备描述表 hbitmap hbitmap, holdbitmap;/ 位图句柄 int nwidth, nheight;/ 位图宽度和高度 int xscrn, yscrn;/ 屏幕分辨率 /为屏幕创建设备描述表 hscrdc = createdc(“display“, null, null, null); 第 21 页 共 30 页 /为屏幕设备描述表创建兼容的内存设备描述表 hmemdc = createcompatibledc(hscrdc); / 获得屏幕分辨率 xscrn = getdevicecaps(hscrdc, horzres); yscrn = getdevicecaps(hscrdc, vertres); nwidth = xscrn; nheight = yscrn; / 创建一个与屏幕设备描述表兼容的位图 hbitmap = createcompatiblebitmap(hscrdc, nwidth, nheight); / 把新位图选到内存设备描述表中 holdbit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论