毕业设计(论文)机房监控系统的设计与实现.doc

上传人:仙人指路1688 文档编号:4151852 上传时间:2023-04-07 格式:DOC 页数:23 大小:1.02MB
返回 下载 相关 举报
毕业设计(论文)机房监控系统的设计与实现.doc_第1页
第1页 / 共23页
毕业设计(论文)机房监控系统的设计与实现.doc_第2页
第2页 / 共23页
毕业设计(论文)机房监控系统的设计与实现.doc_第3页
第3页 / 共23页
毕业设计(论文)机房监控系统的设计与实现.doc_第4页
第4页 / 共23页
毕业设计(论文)机房监控系统的设计与实现.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《毕业设计(论文)机房监控系统的设计与实现.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)机房监控系统的设计与实现.doc(23页珍藏版)》请在三一办公上搜索。

1、机房监控系统的设计与实现摘 要为提高机房使用效率,净化上机环境,杜绝个别用户使用机房内电脑做违规的事情,为机房管理员提供一个好的机房监控系统是必要的。作者在对机房微机管理过程进行了详细调查后,参考了一些网吧的微机管理系统,获得了机房监控系统的设计思路。机房管理系统应当能使管理员极其方便的获取某台微机的屏幕视图,锁定某台电脑的键盘和鼠标输入,并能发送消息给指定的电脑用户。本论文从理论上分析了实现机房监控系统所需要的基础技术的原理,并以VC+6.0作为开发工具,在Win32平台下实现了一个机房监控系统。论文第二部分简述了TCP/IP协议以及Socket编程技术,第三部分讲述了系统的设计目标和通信协

2、议,第四章则介绍了实现过程中使用的核心技术,包括屏幕截图、锁定屏幕以及服务器端和客户端的通信。通过本文的研究,为机房监控系统的设计和实现展示了一个完整的方案,具有一定参考价值。关键词:机房监控系统;屏幕截图;锁定屏幕;SocketThe Design and Implementation of the Computer Room Monitor and Control SystemAbstractIt is necessary to provide a computer room monitor and control system with good quality so that the

3、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 monito

4、r 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 introd

5、uced 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 chap

6、ter 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 referen

7、ce for similar applying.Key words: computer room monitor system; snap screen; lock screen; socket目 录论文总页数:31页1.引言11.1课题背景11.2内容介绍12.相关技术原理介绍22.1 TCP/IP协议22.1.1 TCP/IP协议简介22.1.2 TCP协议22.1.3 IP协议32.1.4 TCP/IP模型32.2 SOCKET技术62.2.1 SOCKET基本概念62.2.2 SOCKET类型及规范72.2.3 WIN SOCKET API82.3 WIN32编程技术133.系统的设计

8、143.1系统设计目标143.2系统架构设计154.系统的实现194.1用户界面的实现194.2核心算法的实现204.2.1客户端和服务器端的通信204.2.2 屏幕截图234.2.3 锁屏和解屏26结 论28参考文献28致 谢30声 明311引言1.1课题背景当今时代是一个信息种类多元化,信息量巨大化,传播速度急速化的时代。要积极面临这种现状,就要能快速的处理各种信息,从而引申出人们对信息处理工具的高度关注。而各种电子设备,尤其是电脑等硬件设备的出现,给人们的日常生活带来极大的变化。随着计算机网络的出现,更使得人们的信息处理方式发生了革命性的改变。毫无疑问,计算机以及由计算机组成的计算机网络

9、已经成为当今时代最佳的信息处理工具。掌握这个工具对于科研和学习有着重要意义。鉴于这种情况,现在许多学校都提供了微机室,让在校学生可以很好的学习计算机操作,并使用计算机辅助学习。对于同学们来说,这本来是个很好的机会,但有个别同学未能珍惜这个机会,他们没有好好利用这些微机进行学习和研究,而是在机房内打游戏或者闲聊等,甚至有人利用电脑进行违反法规的活动。这些同学不但浪费了自身的学习机会,同时也浪费了学校的宝贵资源,而且给周围的同学造成了很不好的影响。因此,如何对机房进行有效的管理成为了一个不容忽视的问题。对于机房管理,一方面应该设立专门的管理员,拟定详细的机房使用规则;另一方面,也应该配备强大的管理

10、软件,辅助管理员进行管理。因此,如何设计和实现机房监控系统成为了本次课题的研究问题。1.2内容介绍文章在第二章介绍了一些基本的技术原理,涉及到TCP/IP协议、Socket技术、Win32编程等概念,这些都是实现机房监控系统的基础技术。在第三章,首先讨论了机房监控系统应该具备哪些功能,接着设计出了服务器端和客户端器的通信协议。在第四章,首先讲述了用户界面的实现,接着着重介绍了几个核心技术的实现,包括如何对某个特定客户端进行屏幕截图,如何锁定指定客户端的屏幕以及如何在服务器端和客户端的进行通信。2相关技术原理介绍2.1 TCP/IP协议2.1.1 TCP/IP协议简介所谓协议是一套用技术术语描述

11、某些事物应该如何做的规则。如果执行不同的协议(一方知道某事的概念,但另一方却不知道),那么他们会因各自的协议无法沟通而完不成有用的工作。在计算机网络领域中,为了完成一项任务,所涉及的两个(或多个)通信实体必须运行同样的协议。Internet是 由众多的计算机网络交错连接形成的网际网,作为Internet成员的各种网络在通讯中分别执行自己的协议。所谓Internet协议是指在Internet的网络之间以及各成员网内部交换信息时要求遵循的协议。在Internet中,到处运行着协议,凡是涉及两个或多个远程实体的通信活动均由协议来支配。协议定义了两个或多个通信实体间所交换消息的格式与顺序,以及在发出和

12、/或收到一个消息或者发生其他事件所采取的行动。TCP/IP是Internet网络上使用的通用协议。Internet依靠上千个网络和百万计的计算机,而 TCP/IP是把它们合在一起的粘结剂。TCP/IP的目标是提供高速网络通信链路。TCP/IP的实际名字来源于两个最重要的协议:TCP协议与IP协议,其中传输控制协议TCP对应于开放系统互联0SI参考模型的传输层协议;网络连接协议IP则对应于OSI参考模型的网络层协议。所以TCP/IP分别是Internet在传输层和网络层执行的协议。2.1.2 TCP协议TCP协议是互联网传输层协议。TCP服务模型包括面向连接的服务和可靠的数据传输服务,调用TCP

13、作为其传输协议的应用同时取得这两种服务。总体来说,TCP保证递送全部数据,但对递送速率和所经历的延迟不加保证。电子邮件、远程终端访问、Web和文件传送都使用TCP。这些应用选择TCP的主要原因在于TCP提供可靠的数据传输服务,能够保证所有数据最终到达其目的地。TCP的传输实体一般为软件实现:一部分是用户进程,一部分是操作系统的部分核心(管理TCP字节流,实现与IP层的接口)。TCP的传输服务是通过在收发双方创建套接字Socket来实现的;Socket的地址是通过IP地址与端口号来标识的。每条TCP的传输连接用发送端套接字、接收端套接字来表示,是点到点的全双工通道(全双工支持同时的双向传输)运行

14、与TCP上的应用程序包括FTP、HTTP、SMTP和TELNET。在Internet内部,从主机传送到主机的信息不是一个恒定的流,而是把数据分解成小包,即数据包。例如你要发一分很长的电子邮件(E-mail)给一位朋友,TCP就将该信息分成很多个数据包,每一个数据包用一序号和接收地址来标记。此外TCP还插入一些纠错信息。接着数据包被传过网络,即把它们传送给远程的主机这就是IP的工作。在另一端TCP接收数据并检查错误。如果有错误发生,TCP就可以要求重发信息。换句话说,IP的工作是把原始数据(数据包)从一端传送到另一端;TCP的工作就是管理这种流动并确保其数据是正确的。把数据分解成数据包有很多的好

15、处。首先,它允许Internet让很多不同的用户在同一时间用同一通讯线路。因为这些数据包不必一起输送,所以通讯线路可以载着所有类型的数据包按它们自己的路径从一地到另一地。就如同一条高速公路上,各类汽车(即使它们开向不同的地方)都在公共道路上行驶。当数据包传输时,它们沿规定的路由从主机到主机,一直到它们到达最终目的地。这意味着Internet很具灵活性。如果一个特定的连接中断了,控制数据流动的计算机通常可以找到另一条路由。事实上,在单一数据传输中,多个数据包完全可能沿不同的路由传输。当条件改变时,网络可获得当时最好的连接。如当网络的某一部分过载,数据包可以改变路线去走那些比较空闲的线路。用数据包

16、传输的另一个好处是,当某处出错,只须重新传送单个数据包,而不是整个信息。这样会大大加快Internet的传输总速度。这种灵活性产生很高的可靠性。Internet运行非常好,虽然所有数据包都必须通过很多计算机,但它可以用几秒钟就把一个文件从一主机传输到另一主机,尽管它们相距很远。2.1.3 IP协议网际网络协议(IP)用于数据报交换网络互连系统种,是TCP/IP协议堆栈所采用的传输协议。IP协议的基本数据形态是数据元(datagram),一般都成为数据报,此协议提供了从来源主机到目的主机之间数据报的传输机制。IP数据报中携带这来源地址和目的地址,利用这些地址数据,可将数据报传输到目的主机。IP协

17、议具有数据报分割以及重组机制,需要的时候可以将数据报作适当的分割以及重组,以便能够在网络中传输。IP协议是网络层协议,它是一种不可靠的,无连接导向的协议,无论是端对端或者路由器对路由器,都不提供可靠的传输,也不会提供确认信息,除了报头校验和外,IP协议本身没有数据的错误控制机制,一旦数据发生错误或者未能完整的接收,都不能重传。甚至即使是只有一个字节发生错误或者没有收到,也必须将整个数据报都丢弃。虽然,IP协议提供了数据报的传输机制,但是并没有提供传输的可靠性、流量控制、顺序性服务机制,它所提供的只是最佳化的传输服务。2.1.4 TCP/IP模型习惯上,人们把Internet的通讯协议笼统地称为

18、TCP/IP协议,也有人把Internet称为TCP/IP网或TCP/IP Internet网。在这种意义下,Internet的TCP/IP协议可以说就是基于四种模型的协议:即应用层、传输层、网络层和网络访问层。其中网络访问层又分为网络接口层(链路层)和最基础的物理层。所以也可以说Internet的网络协议是基于五层模型的协议。根据TCP/IP协议,互联网分为4层,加上最底层的硬件层一共是5层应用层(第五层)传输层(第四层)网络层(第三层)链路层(第二层)物理层(第一层)图2-1 TCP/IP协议分层1)物理层:物理层的任务是把帧中的各位从一个节点移往下一个节点。这一层的协议也取决于链路,而进

19、一步取决于链路真正的传输介质。物理层提供了一个基本机制:对二进制数据(比特)进行编码(发送到物理介质)和解码(从物理介质接收),例如10Mbit/s(bit/s指比特每秒)以太网的曼彻斯特编码、光纤分布式数据接口(Fiber Distributed data Interface,简称FDDI)的4B/5B编码;物理层也负责通知第二层(链路层)何时访问介质。物理层以比特流的方式传送来自链路层的数据,而不理会数据的含义或格式;同样,它接收数据以后,不加分析直接传给链路层。物理层也定义与介质的物理连接机制,但不是介质本身,按照参考模型的原理,实际的物理介质在物理层之下。2)链路层:链路层的任务是把完

20、整的帧从一个网络组建移往某个紧邻的组件,负责管理数据格式。它定义了将数据组成正确帧的规程和在网络中传输帧的规程,帧是指一串数据,它是数据在网络中传输的单位。网络层在源端和目的端之间经由一系列分组交换机(路由器)路由分组。为了将一个分组从一个节点(主机或分组交换机)移往其路径上的下一个节点,网络层必须依赖由链路层提供的服务。链路层提供了对链路的管理,链路层提供的服务取决于应用在链路上的特定链路层协议。分组从源端到目的端一般需要经过多个链路,每个分组沿其路径到达不同链路是,可能有不同的链路层协议来处理。既是说,IP从不同的链路层协议获取的服务会不一样。链路层负责监督相邻网络节点的信息流动,它使用检

21、错或纠错技术来确保正确的传输:当链路检测到错误时,它请求重发,或是根据情况纠正。此外,链路层还要解决流量控制的问题。3)网络层:网络层提供越过多个网络的选路功能,为端点提供无连接的数据报访问,并定义端到端通过整个互联网网络的寻址功能。网络层负责寻址、打包以及从一台计算机通过一个或多个路由器到最终目标的包转发机制。网络层的核心协议有:IP、ARP/RARP、ICMP和IGMP。IP协议(Internet protocol,简称IP)是TCP/IP模型的核心,它是一个路由协议,负责IP寻址、路由选择、分段及包重组。4)传输层:传输层给应用提供在其客户端和服务器之间传输应用层消息的服务。即传输层负责

22、为两个用户进程之间建立、管理和拆除可靠而又有效的端到端连接。传输层的核心协议是传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram Protocol)。TCP给其应用提供面向连接的服务,该服务包括应用层消息往目的地有保证的递送以及流量控制(既发送端和接收端之间速度的匹配)。TCP还把长数据块分割成较小的段,并提供拥塞控制机制。这样当网络处于拥塞状态时,源端会抑制其发送速率。UDP协议给其应用提供无连接的服务,是一个几乎没有任何修饰的服务。5)应用层:应用层负责支持网络应用,直接与用户或应用程序通信,它给应用程序提供访

23、问其他层服务的能力并定义应用程序用于交换数据的协议。应用层包括许多协议,例如支持Web的HTTP、支持文件传送的FTP、支持电子邮件的SMTP 协议都建立在这一层。TCP/IP应用程序使用的应用层接口有Windows套接字(Winsock)、NetBIOS等。Windows套接字提供Windows下的标准应用编程接口;NetBIOS是工业标准接口,用于访问协议服务,如会话、数据报和名字解析等。Internet 的核心层是网络层和传输层,相应的核心协议是IP协议和TCP协议。IP 协议的主要功能包括无连结数据报传送数据报寻径以及差错处理三部分。IP协议的特点是点到点的,IP对等实体间的通信不经过

24、中间机器,对等实体所在的机器位于同一物理网络,对等机器之间有直接的物理连接。IP层的主要功能是屏蔽下面物理层的差别,向上一层提供一致的数据格式。所有要传输的数据,被按照一定的格式分组封装层IP数据报,数据报单元通过寻径等机制进行传输,在接收方数据报进行重组,得到最初要传送的数据。由于IP协议是不可靠的数据传输协议,由于网络的拥塞而发生的数据丢失等情况是不可避免的,因此Internet 还必须有一定的控制重传机制,这就是差错与控制报文协议(ICMP)。尽管计算机通过安装IP软件,从而保证了计算机之间可以发送和接收数据,但IP协议还不能解决数据分组在传输过程中可能出现的问题。因此,若要解决可能出现

25、的问题,还需要TCP协议来提供可靠的并且无差错的通信服务。TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收数据以及终止连接。传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。即使在 Internet 暂时出现堵塞的情况下,TCP也能够保证通信的可靠。互联网是一个庞大的国际性网络,网路上的拥挤和空闲时间总是交替不定的,加上传送的距离也远近不同,所以传输数据所用时间也会变化不定。TCP协议具有自动调整超时值的功能,能很好地适

26、应 Internet 上各种各样的变化,确保传输数值的正确。IP协议只保证计算机能发送和接收分组数据,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。虽然IP和TCP这两个协议的功能不尽相同,也可以分开单独使用,但它们是在同一时期作为一个协议来设计的,并且在功能上也是互补的。只有两者的结合,才能保证 Internet 在复杂的环境下正常运行。凡是要连接到 Internet 的计算机,都必须同时安装和使用这两个协议,因此在实际中常把这两个协议统称作TCP/IP协议。2.2 Socket技术2.2.1 Socket基本概念20世纪80年代初,美国政府的高级研究机构(ARPA)给加

27、利福尼亚大学Berkeley分校提供资金,让他们在UNIX操作系统下实现TCP/IP协议。在这个项目中,研究人员为TCP/IP网络通信开发了API(应用程序接口)。这个API称为Socket接口。如今Socket接口是TCP/IP网络最为通用的API,也是在Internet上进行应用开发最为通用的API。Internet是有不同种类的网络互连而成,实现不同网络及计算机之间交互操作的关键问题是由TCP/IP协议来解决的。TCP/IP协议的核心是传输层协议(TCP和UDP)、网络层协议(IP)和网络接口层,前两层在操作系统内核中实现。操作系统内核是不能直接为一般用户所感受到的,一般用户感受到的只有

28、应用程序(包括系统应用程序),即各种应用程序构成了操作系统的用户视图。两者之间的接口是网络编程界面(程序员界面)。因此,TCP/IP网络环境下的应用程序也不是直接与TCP/IP核心打交道,而是与网络应用编程接口(套接字,socket)打交道,编程接口构成了核心协议的用户视图。实际上,Socket在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。在应用开发中,就像使用文件句柄一样,可以对Socket句柄进行读、写操作。可以把Socket看成是一根连接线,当在两台计算机之间建立了一个Socke

29、t之后,两台计算机就可以通过这根连接线来完成信息交互,所做的仅仅是向这根连接线里写入数据,再从其中读出数据,而不必担心会不会由信息丢失,Socket会负责照看好数据。Socket用于表达两台机器之间的连接终端。一个网络应用涉及两台(或两台以上)不同主机中跨网络彼此通信的两个进程。这两个进程通过经由各自的套接字(Socket)发送和接收消息彼此通信。对于一个给定的连接,每台机器上都有一个套接字。有点像我们打电话,用电缆把电话连接起来,中间的物理结构和具体实现过程我们不必了解,只要我们能进行通话即可。套接字是单台主机内应用层和传输层之间的接口。套接字也用于指代应用程序和网络之间的应用程序接口(ap

30、plication program interface,简称API),因为它又是用于构造互联网中的网络应用程序的编程接口。当我们进行编程时,需要用到Socket接口,Socket接口定义了许多函数或例程,我们可以直接调用它们实现网络连接、通信等功能。Socket接口为我们建立通信信道,我们可以通过这条通道来与一台或多台计算机进行连接。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字规范的计算机之间的通信成为可能。对于应用程序来说,它就像一个服务协议插座一样,各种不同的协议,对应不同的端口。我们可以把套接字看作相应进程上的“门”:进程把消息发送到网络或

31、从网络接收消息都得经过自身得套接字。当一个进程想给另一台主机中的另一个进程发送消息是,它就把该消息推出自家的门。该进程认定在这扇门的另一侧有一个传输设施会把这个消息传输到目的进程的门口。在服务器进程处于运行状态的情况下,客户进程就能够初始化一个到服务器的TCP连接了,这是通过在客户程序中创建一个套接字对象来完成的,当客户创建了它的套接字对象的时候,它详细说明了服务器进程的地址,也就是,服务器的IP地址和进程的端口号,一旦创建了套接字对象,客户端的TCP就发起一个三次握手,并建立一个和服务器的TCP连接,三次握手对客户和服务器程序来说是完全透明的。2.2.2 Socket类型及规范可以提供给用户

32、使用的套接字有两种,它们分别是数据报套接字和流式套接字:1)流式套接字(SOCKET_STREAM)提供了面向连接、双向可靠的数据流传输服务,数据无出错,无重复地发送且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。流式套接字使用传输控制协议(TCP)。它提供了一种可靠的,面向连接的数据传输方式。通常基于连接的流式套接字是设计客户机/服务器应用程序时的标准。流式套接字主要用于大批量数据或者让数据按顺序无重复的到达目的地而使用2)数据报式套接字(SOCKET_DGRAM)提供了无连接服务。数据包以独立形式被发送,不提供无错保证,数据可能丢失或者重复,并且接收顺序无序

33、。数据报套接字使用用户数据报协议(UDP)。实际使用中,同一个分组数据报可能不止一次的被发送,一般要等到接收方发回确认收到的消息才会停止发送。一般有两种套接字规范:一种是针对UNIX系统的Berkely Socket规范;一种是占主流地位的Windows sockets(简称WinSock)规范,它是Microsoft 以Berkely Socket规范为范例开发的windows下的网络编程接口。Windows socket规范定义并记录了如何使用API与Internet协议相连接,且所有的Windows socket实现都支持流式套接字和数据报套接字。应用程序调用Windows socket

34、的API实现相互之间的通信。Windows socket又利用下层的网络通信协议功能和操作系统调用实现实际的通信工作。2.2.3 Win Socket API本文在软件实现上使用的Socket函数正是Windows Socket API。下面介绍几个重要的API:一) WSAStartup函数 int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); 使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操

35、作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。 例:假如一个程序要使用2.1版本的Socket,那么程序代码如下 wVersionRequested = MAKEWORD( 2, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); 二) WSACleanup函数 int WSAClean

36、up (void); 应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。 三) socket函数 SOCKET socket( int af, int type, int protocol ); 应用程序调用socket函数来创建一个能够进行网络通信的套接字。第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置PF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议。

37、该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。下面是一个创建流套接字的例子: struct protoent *ppe; ppe=getprotobyname(tcp); SOCKET Listen

38、Socket=socket(PF_INET,SOCK_STREAM,ppe-p_proto); 四) closesocket函数 int closesocket( SOCKET s ); closesocket函数用来关闭一个描述符为s套接字。由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构。当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个

39、套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。closesocket函数如果执行成功就返回0,否则返回SOCKET_ERROR。五) send函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数

40、来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s

41、的发送缓冲区的剩余空间和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中的

42、数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回SOCKET_ERROR) 注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。 六) recv函数 int recv( SO

43、CKET s, char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完

44、毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。 注意:在Unix系统下,如果re

45、cv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。 七) bind函数 int bind( SOCKET s, const struct sockaddr FAR *name, int namelen ); 当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结

46、构,该结构是这样定义的: struct sockaddr u_short sa_family; char sa_data14; ; sa_family指定地址族,对于TCP/IP协议族的套接字,给其置AF_INET。当对TCP/IP协议族的套接字进行绑定时,我们通常使用另一个地址结构: struct sockaddr_in short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero8; ; 其中sin_family置AF_INET;sin_port指明端口号;sin_addr结构体中只有一个唯一的字段s_

47、addr,表示IP地址,该字段是一个整数,一般用函数inet_addr()把字符串形式的IP地址转换成unsigned long型的整数值后再置给s_addr。有的服务器是多宿主机,至少有两个网卡,那么运行在这样的服务器上的服务程序在为其Socket绑定IP地址时可以把htonl(INADDR_ANY)置给s_addr,这样做的好处是不论哪个网段上的客户程序都能与该服务程序通信;如果只给运行在多宿主机上的服务程序的Socket绑定一个固定的IP地址,那么就只有与该IP地址处于同一个网段上的客户程序才能与该服务程序通信。我们用0来填充sin_zero数组,目的是让sockaddr_in结构的大小

48、与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 *)&saddr,sizeof(saddr); 八) listen函数 int listen( SOCKET s, int backlog ); 服务程序可以调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将维护一个客户连接请求队列,该队列最多容纳backlog个客户连接请求。假如该函数执行成功,则返回0;如果执行失败,则返回SOCKET_ERROR。 九) accept函数 SOCKET accept( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen ); 服务程序调用accept函数从处于监听状态

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号