毕业设计(论文)-基于TCPIP上的Socket编程接口技术及应用.doc_第1页
毕业设计(论文)-基于TCPIP上的Socket编程接口技术及应用.doc_第2页
毕业设计(论文)-基于TCPIP上的Socket编程接口技术及应用.doc_第3页
毕业设计(论文)-基于TCPIP上的Socket编程接口技术及应用.doc_第4页
毕业设计(论文)-基于TCPIP上的Socket编程接口技术及应用.doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计(论毕业设计(论文)文)设计设计(论文论文)题目:题目:基于TCPIP上的Socket编程接口技术及应用2008年6月15日I目录摘要.IIIAbstract.IV第一章绪论.11.1引言.11.2研究的目的及意义.11.3研究的方法.2第二章套接字的理论知识.32.1TCPIP网络模型和协议特点.32.2网间进程通信.42.3端口通信的特点.52.4半相关和全相关.62.5客户服务器模式.62.5.1服务器主动连接步骤.62.5.2客户请求连接步骤.72.6面向连接和无连接.7第三章套接字的描述及编程原理.93.1套接字的形象描述.93.2套接字的概念.103.3如何开发一个SERVER-CLIENT模型的程序.113.4TCPIP的SOCKET提供的套接字的类型。.123.5基本套接字系统调用.133.5.1创建套接字.133.5.2指定本地地址.143.5.3建立套接字连接.143.5.4监听连接.163.5.5数据传输.163.5.6关闭套接字.17II3.6套接字客户服务器编写流程.183.6.1服务器程序实现的过程.183.6.2客户机程序实现的过程.19第四章SOCKET在网络通信中的应用.234.1实时数据网络程序描述服务器程序设计.234.2客户端程序设计.244.3实时数据传输帧格式.26结论.35参考文献.37致谢.39III基于TCPIP上的Socket编程接口技术及应用摘要本文对TCPIP协议核心与应用程序的关系进行了分析提出了利用WindowsSockets套接字编程的一般方法。在此基础要解决基于TCPIP协议下的网络通信问题并且能够准确方便地在服务器和客户端实时收发文件和互相通信。本文首先详细介绍了套接字的理论知识,通过对套接字编程技术概念的详解和套接字编程原理的详细描述,来建立完整的套接字技术的理论知识体系,其中主要介绍了在TCPIP网络应用中,通信的两个进程间相互作用的主要模式是客户服务器模式(ClientServermodel),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。然后再通过具体的应用实例及其部分源代码更深入的理解基于TCPIP网络协议上的套接字技术的编程和通信原理,其中客户端服务器均是用VB6.0编程语言。关键词:TCPIP协议,套接字,通信,网络编程IVBasedontheTCPIPontheSocketTechnologyandApplicationProgrammingInterfaceAbstractThepaperanalysestherelationshipbetweenTCPIPprotocolandapplicationdescribestheapplicationofsocketindetailsolvedtheproblemofnetworkcommunicationonthefoundationofTCPIPprotocolandintroducesitsproceduresinstream-grammode.ThispaperdetailsthesocketoftheoreticalknowledgebythesocketprogrammingandtechnicalconceptofDetailedExplanationsocketprogrammingadetaileddescriptionofprincipletoestablishacompletetheoreticalknowledgeofthesockettechnologysystemwhichmainlyIntroducedaTCPIPnetworkapplicationsthecommunicationsinteractionbetweenthetwoprocessesarethemainmodeofclientservermodel(ClientServermodel)thatiscustomerservicerequestssenttotheservertheserverreceivesarequestprovidethecorrespondingServices.Andthenthroughspecificexamplesoftheapplicationofthesourcecodeandmorein-depthunderstandingbasedontheTCPIPnetworkprotocolonthesocketprogrammingandcommunicationtechnologyprinciplesclientserverisusedVB6.0programminglanguage.Keywords:TCPIPprotocol,sockets,communications,networkprogram-1-第一章绪论1.1引言网络通信的主要问题在于通信协议的制定一个好的协议能把各种操作描述清楚使服务端能够准确地执行对应的操作。在众多的通信协议中TCPIP协议簇得到了最为广泛的应用。TCPIP产生于Internet的研究和应用的实践中是一个开放的网络协议体系其最显著的优点是便于实现各种异构网络的无缝连接和网络应用程序的跨平台移植因此它得到了众多操作系统的广泛支持逐渐成为互联网事实上的协议标准。TCPIP协议实际上就是在物理网上的一组完整的网络协议定义了计算机网络通信的规则。其中TCP提供传输层服务而IP则提供网络层服务。但是直接面向TCPIP协议进行网络编程涉及到路由选择、流量控制、拥塞控制、分段组装、检错纠错、QOS协商等一系列底层协议细节极为繁琐复杂。WindowsSocket(套接字)使软件开发人员在开发网络通信软件时不必关心具体的协议细节寻找并利用已经安装好的底层协议来进行数据传输因而可以大大减少网络通信软件开发中时间和经费的投入。作为网络通信的一项重要内容如何准确方便地在服务器与客户端实时收发各种格式和任意大小的文件是应用程序编制的难点所在。基于TCPIP协议和Windows套接字本文介绍了网络间传送文件的基本方法还有基于TCPIP上的socket编程技术和应用。1.2研究的目的及意义随着计算机网络技术的发展,原来物理上的接口(如键盘、鼠标、网卡、显示卡等输入输出接口)已不能满足网络通信的要求了,TCPIP协议作为网络通信的标准协议就解决了这个通信难题。TCPIP协议集成到操作系统的内核中,这就相当于在操作系统中引入了一种新的输入输出接口技术,因为在TCPIP协议中引入了一种称之为“Socket(套接字)”应用程序接口。有了这样一种接口技术,一台计算机就可以通过软件的方式与任何一台具有Socket接口的计算机进行通信。端口在计算机编程上也就是“Socket接口”。有了这些端口后,这些端口又是如何工作呢?例如一台服务器为什么可以同时是Web服务器,也可-2-以是FTP服务器,还可以是邮件服务器等等呢?其中一个很重要的原因是各种服务采用不同的端口分别提供不同的服务,比如:通常TCPIP协议规定Web采用80号端口,FTP采用21号端口等,而邮件服务器是采用25号端口。这样,通过不同端口,计算机就可以与外界进行互不干扰的通信。据专家们分析,服务器端口数最大可以有65535个,但是实际上常用的端口才几十个,由此可以看出未定义的端口相当多。这就是那么多黑客程序都可以采用某种方法,定义出一个特殊的端口来达到入侵的目的的原因所在。1.3研究的方法TCPIP提供的网络API(应用程序接口)主要是Socket,本文主要依据计算机在TCPIP端口通信中,主要采用了客户机服务器的模式,Socket就是为这种模式而设计的,针对客户机和服务器分别提供了不同的系统调用,利用这些调用,客户机可以随意申请一个Socket,系统就为它分配一个Socket编号,而服务器则拥有一个全局公认的Socket,任何客户机都可以向它发出连接请求。网络编程,即编写通过电脑网络和其他程序进行通讯的程式。在当前通信模式下,相互通信的网络程式中,一方称为客户程式(client),另一方称为服务器程式(server),大多数操作系统都提供了编译好的网络程式,比如Web客户程式(浏览器),Web服务器程式,连同FTP,Telnet等,而应用Socket编程接口能够编写自己的网络通信程式。在TCPIP世界中,网络通讯的基本模式如下:每一台通讯的主机都有一个本网络环境中唯一的IP地址,而且一台主机上往往会有多个通讯程式存在,每个这样的程式都要占用一个通讯端口。因此,一个IP地址,一个通讯端口,就能确定一个通讯程式的位置(某个IP上占用某个端口的程式)。通讯程式分为服务程式和客户程式,他们的区别在于,服务程式总是被动的等待连接,服务程式一启动,初始化完毕就进入等待连接状态;而客户程式启动后,向远程服务程式发出连接请求,服务程式收到连接请求后,按照一定的规则建立连接,连接完成后,两个程式就之间就建立了一个虚拟的数据通讯链路,这些程式能够直接从自己打开的套接口读入和写出数据,而不用关心实际的数据链路。-3-第二章套接字的理论知识为了能更好的了解套接字编程接口技术,在使用套接字编程之前,让我们来学习并建立以下几个概念:2.1TCPIP网络模型和协议特点从1977年到1983年国际标准化组织(ISO)制定了一个开放式系统互连参考模型即OSI参考模型。ISOOSI模型用“层”将网络分成定义好的功能化块开放系统提供了一系列描述各种规范、标准的文档和方法网络设计人员按照此模型关于各层的描述可以很灵活地根据实际需要改变层的数目、各层的名字以及层的功能等建立实际的网络。与ISO的OSI七层参考模型不同TCPIP不是作为标准制定的而是产生于In-ternet的研究和应用的实践中4。二者在细节上存在一些差异,TCPIP的结构将网络分成四个层次,分别是应用层、传输层、网络层和数据链路层。这将国际标准组织(ISO)制定的开放系统互联参考模式(OSI)的七层传输参考模式中的一些层面合并,二者之间映射关系如表1所示。表表2.12.1TCPIPTCPIP与与OSIOSI结构模型的映射关系结构模型的映射关系OSI七层网络模型LinuxTCPIP四层概念模型对应网络协议应用层(Application)TFTPFTPNFSWAIS表示层(Presentation)TelnetRloginSNMPGopher会话层(Session)应用层SMTPDNS传输层(Transport)传输层TCPUDP网络层(Network)网际层IPICMPARPRARPAKPUUCP数据链路层(DataLink)FDDIEthernetArpanetPDNSLIPPPP物理层(Physical)网络接口IEEE802.1AIEEE802.2到IEEE802.11-4-TCPIP协议实际上就是在物理网上的一组完整的网络协议。其中TCP是提供传输层服务而IP则是提供网络层服务。在TCPIP协议族的分层体系结构中链路层和网络层都有自己的地址格式。链路层需要一个硬件地址硬件地址被分配给每一块网络适配卡存放于网卡的ROM中它惟一地标识在网络的主机。网络层地址(IP地址)是一个逻辑地址用于标识主机将连接到哪一个网段中。为了标识主机上不同的网络通信进程在传输层也需要进行编址即协议端口。各个通信进程通过系统调用与某个端口绑定后传输到该端口的所有数据都被相应的进程接收,端口号用于标识用户希望访问的进程。TCPIP协议的核心部分是传输层协议(TCP、UDP)网络层协议(IP)和物理接口层这三层通常是在操作系统内核中实现。因此用户一般不涉及。编程时编程界面有两种形式:一、是由内核直接提供的系统调用二、使用以库函数方式提供的各种函数。前者为核内实现后者为核外实现。用户服务要通过核外的应用程序才能实现即通过使用套接字来实现。图1是TCPIP协议核心与应用程序关系图。图2.1TCPIP协议核心与应用程序关系图2.2网间进程通信进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIXBSD中的管道(pipe)、命名管道(namedpipe)和软中断信号(signal),UNIXsystemV的消息(message)、共享存储区(sharedmemory)和信号量(semaphore)等,但都仅限于用在本机进-5-程之间通信。根据不同的标准,进程之间通信的类型有不同的分类:低级通信和高级通信,直接通信和间接通信,本地通信和远程通信等8。低级通信和高级通信是根据传递的内容来分类,低级通信之传递状态和控制信息,高级通信则可以高效的传输大量数据。由于低级通信传送的数据流量小,容易出错,现在一般考虑高级通信机制。直接通信和间接通信的区别在于传送的过程,直接通信的信息直接传递给接收方,而接收方允许接受任何发送方的信息,在读取信息是获知对方。本地通信是在本机内的进程通信,而远程通信是我们所说的网间的通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(processID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。2.3端口通信的特点按照TCPIP协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCPIP协议提出了协议端口(protocolport,简称端口)的概念,用于标识通信的进程。端口是一种抽象的软件结构(包括一些数据结构和IO缓冲区)。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。进程端口号类似于文件描述符,每个端口都拥有一个叫端口号(portnumber)的整数型标识符,用于区别不同端口。由于TCPIP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立7,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。-6-端口号的分配是一个重要问题。有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合适的系统调用将自己与该端口号联系起来(绑定)。TCPIP端口号的分配中综合了上述两种方式。TCPIP将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口(即周知口,well-knownport)6,即使在不同的机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP和UDP均规定,小于256的端口号才能作保留端口。2.4半相关和全相关所谓半相关是指网络中用一个三元组可以在全局唯一标志一个进程:协议、本地地址、本地端口号这样一个三元组,叫做一个半相关(half-association),它指定连接的每半部分。关于全相关是指一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:协议,本地地址,本地端口号,远地地址,远地端口号,这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关3。2.5客户服务器模式在TCPIP网络应用中,通信的两个进程间相互作用的主要模式是客户服务器模式(ClientServermodel),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务10。客户服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是客户服务器模式。2.5.1服务器主动连接步骤-7-客户服务器模式建立连接的过程中服务器采取的是主动请求方式,首先服务器方要先启动,并根据请求提供相应服务,其中包括以下步骤:1.打开一通信通道并告知本地主机,它愿意在某一公认地址上(周知口,如FTP为21)接收客户请求;2.等待客户请求到达该端口;3.接收到重复服务请求,处理该请求并发送应答信号。接收到新的服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、c)。新进程处理此客户请求,并不需要对其它请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。4.返回第二步,等待另一客户请求。5.关闭服务器2.5.2客户请求连接步骤对于客户向服务器请求的连接过程中,大多数情况客户端需等到服务器为当前一步做出应答后才能进行下一步操作。1.打开一通信通道,并连接到服务器所在主机的特定端口。2.向服务器发服务请求报文,等待并接收应答或者继续提出请求。3.请求结束后关闭通信通道并终止。从上面所描述过程可知:客户与服务器进程的作用是非对称的,因此编码不同服务进程一般是根据客户的请求而启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。2.6面向连接和无连接面向连接服务是电话系统服务模式的抽象,即每一次完整的数据传输都要经过建立连接,使用连接,终止连接的过程7。在数据传输过程中,各数据分组不携带目的地址,而使用连接号(connectID)。本质上,连接是一个管道,收发数据不但顺序一致,而且内容相同。TCP协议提供面向连接的虚电路。无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不能保证分组的先后顺序,不进行分组出错的恢复与重传,不保证传输的可靠性。UDP协议提供无连接的数据报服务。-8-9-第三章套接字的描述及编程原理3.1套接字的形象描述套接字也被称为socket,socket的英文原义是“孔”或“插座”。在这里作为4BDSUNIX的进程通信机制,取后一种意义。socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程,话音传输的过程以及整个电话系统的技术细节对他都是透明的,这也与socket机制非常相似。socket利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。至此,我们对socket进行了直观的描述。抽象出来,socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。在网间内部,每一个socket用一个半相关描述:协议,本地地址,本地端口。一个完整的socket有一个本地唯一的socket号,由操作系统分配。最重要的是,socket是面向客户服务器模型而设计的,针对客户和服务器-10-程序提供不同的socket系统调用。客户随机申请一个socket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的socket,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。socket利用客户服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器socket半相关为全局所公认非常重要。那么两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何一方的socket固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。Socket接口是访问Internet使用得最广泛的方法。如果你有一台刚配好TCPIP协议的主机,其IP地址是01,此时在另一台主机或同一台主机上执行ftp01,显然无法建立连接。因01这台主机没有运行FTP服务软件。同样,在另一台或同一台主机上运行浏览软件如Netscape,输入http:01,也无法建立连接。现在,如果在这台主机上运行一个FTP服务软件(该软件将打开一个Socket,并将其绑定到21端口),再在这台主机上运行一个Web服务软件(该软件将打开另一个Socket,并将其绑定到80端口)。这样,在另一台主机或同一台主机上执行ftp01,FTP客户软件将通过21端口来呼叫主机上由FTP服务软件提供的Socket,与其建立连接并对话。而在netscape中输入http:01时,将通过80端口来呼叫主机上由Web服务软件提供的Socket,与其建立连接并对话。在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。3.2套接字的概念在网络编程中最常见的是客户服务器模式。以该模式编程时客户端在需要的时候,向服务端发出连接请求,服务端有一个进程(或多个进程)在指定的-11-端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。使用socket调用后,仅产生了一个可以使用的socket描述符,这时还不能进行通信,还要使用其他的调用,以使得socket所指的结构中使用的信息被填写完。在使用TCP协议时,一般服务端进程先使用socket调用得到一个描述符,然后使用bind调用将一个名字与socket描述符连接起来,对于Internet域就是将Internet地址联编到socket。之后,服务端使用listen调用指出等待服务请求队列的长度。然后就可以使用accept调用等待客户端发起连接(一般是阻塞等待连接,),一旦有客户端发出连接,accept返回客户的地址信息,并返回一个新的socket描述符,该描述符与原先的socket有相同的特性,这时服务端就可以使用这个新的socket进行读写操作了。一般服务端可能在accept返回后创建一个新的进程进行与客户的通信,父进程则再到accept调用处等待另一个连接。客户端进程一般先使用socket调用得到一个socket描述符,然后使用connect向指定的服务器上的指定端口发起连接,一旦连接成功返回,就说明已经建立了与服务器的连接,这时就可以通过socket描述符进行读写操作了。使用无连接的UDP协议时,服务端进程创建一个socket,之后调用recvfrom接收客户端的数据报,然后调用sendto将要返回客户端的消息发送给客户进程。客户端也要先创建一个socket,再使用sendto向服务端进程发出请求,使用recvfrom得到返回的消息。3.3如何开发一个Server-Client模型的程序服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口10。Socket接口是TCPIP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCPIP网络上的应用程序。Socket接口设计者最先是将-12-接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的IO,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。3.4TCPIP的socket提供的套接字的类型。常用的Socket类型有三种:流式Socket(SOCK_STREAM)、原始式套接字(SOCK_RAW)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用;原始式套接字(SOCK_RAW)该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。在网络编程中较多采用的是面向连接的套接字使用面向连接的协议(TCP)。调用时序图如图2.1所示。-13-图3.1面向连接协议的套接字时序调用图另外一种常见的套接字类型无连接协议的套接字,其使用无连接的UDP服务应用。如图2.2给出了数据报式套接字时序调用图-14-图3.2无连接协议的套接字时序调用图3.5基本套接字系统调用为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:intsocket(intdomaininttypeintprotocol);domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCPIP协议族);type参数指定socket的类型:SOCK_STREAM、SOCK_RAW或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上建立一个Socket意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。3.5.1创建套接字socket()应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:SOCKETPASCALFARsocket(intafinttypeintprotocol)该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,UNIX系统支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而-15-DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。参数type描述要建立的套接字的类型。参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。因此,socket()系统调用实际上指定了全相关五元组中的“协议”这一元。3.5.2指定本地地址bind()当一个套接字用socket()创建后,存在一个名字空间(地址族)但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:intPASCALFARbind(SOCKETsconststructsockaddrFARnameintnamelen)参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。参数name是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。namelen表明了name的长度。如果没有错误发生,bind()返回0。否则返回值SOCKET_ERROR。bind()在错误的时候依然是返回-1,并且设置全局错误变量errno。在你调用bind()的时候,你要小心的另一件事情是:不要采用小于1024的端口号。所有小于1024的端口号都被系统保留!你可以选择从1024到65535的端口(如果它们没有被别的程序使用的话)。你要注意的另外一件小事是;有时候你根本不需要调用它。如果你使用connect()来和远程机器进行通讯,你不需要关心你的本地端口号(就象你在使用telnet的时候),你只要简单的调用connect()就可以了,它会检查套接字是否绑定端口,如果没有,它会自己绑定一个没有使用的本地端口。3.5.3建立套接字连接connect()与accept()这两个系统调用用于完成一个完整相关的建立,其中connect()用于建立连接。无连接的套接字进程也可以调用connect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。这样做的优点是程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与任何套接-16-字建立“连接”accept()用于使服务器等待来自某客户进程的实际连接。connect()的调用格式如下:intPASCALFARconnect(SOCKETsconststructsockaddrFARnameintnamelen)参数s是欲建立连接的本地套接字描述符。参数name指出说明对方套接字地址结构的指针。对方套接字地址长度由namelen说明。如果没有错误发生,connect()返回0。否则返回值SOCKET_ERROR。在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。由于地址族总被包含在套接字地址结构的前两个字节中,并通过socket()调用与某个协议族相关。因此bind()和connect()无须协议作为参数。accept()的调用格式如下:SOCKETPASCALFARaccept(SOCKETsstructsockaddrFARaddrintFARaddrlen)参数s为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。addr指向客户方套接字地址结构的指针,用来接收连接实体的地址。addr的确切格式由套接字创建时建立的地址族决定。addrlen为客户方套接字地址的长度(字节数)。如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。否则返回值INVALID_SOCKET。accept()用于面向连接服务器。参数addr和addrlen存放客户方的地址信息。调用前,参数addr指向一个初始值为空的地址结构,而addrlen的初始值为0;调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,而连接请求是由客户方的connect()调用发出的。当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。新的套接字可用于处理服务器并发请求。四个套接字系统调用,socket()、bind()、connect()、accept(),可以完成一个完全五元相关的建立。socket()指定五元组中的协议元,它的用法与是否为客户或服务器、是否面向连接无关。bind()指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关:在服务器方,无论是否面向连接,均要调用bind();若采用面向连接,则可以不调用bind(),而通过connect()自动-17-完成。若采用无连接,客户方必须使用bind()以获得一个唯一的地址。3.5.4监听连接listen()此调用用于面向连接服务器,表明它愿意接收连接。listen()需在accept()之前调用,其调用格式如下:intlisten(SOCKETsintbacklog)参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。如果没有错误发生,listen()返回0。否则它返回SOCKET_ERROR。listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必须的连接,并建立长度为backlog的请求连接队列。调用listen()是服务器接收一个连接请求的四个步骤中的第三步。它在调用socket()分配一个流套接字,且调用bind()给s赋于一个名字之后调用,而且一定要在accept()之前调用。3.5.5数据传输send()与recv()当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:intsend(SOCKETsconstcharFARbufintlenintflags)参数s为已连接的本地套接字描述符。buf指向存有发送数据的缓冲区的指针,其长度由len指定。flags指定传输控制方式,如是否发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR。recv()调用用于在参数s指定的已连接的数据报或流套接字上接收输入数据,格式如下:intrecv(SOCKETscharFARbufintlenintflags)参数s为已连接的套接字描述符。buf指向接收输入数据缓冲区的指针,其长度由len指定。flags指定传输控制方式,如是否接收带外数据等。如果没-18-有错误发生,recv()返回总共接收的字节数。如果连接被关闭,返回0。否则它返回SOCKET_ERROR。3.5.6关闭套接字closesocket()closesocket()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。closesocket()的调用格式如下:图3.3客户机服务器Socket通讯的工作模式3.6套接字客户服务器编写流程创建服务器端创建服务器端SocketSocket服务器端服务器端SocketSocket登记登记某端口某端口监听来自客户端的连监听来自客户端的连接请求接请求阻塞直到客户端发来阻塞直到客户端发来连接请求连接请求接收来自于客户端的接收来自于客户端的请求数据请求数据处理请求数据处理请求数据返回处理的数据客户返回处理的数据客户端端接收响应数据接收响应数据创建客户端创建客户端Socket通过服务器端的地通过服务器端的地址和端口号向服务址和端口号向服务器端发出连接请求器端发出连接请求发送请求数据到服发送请求数据到服务端务端-19-3.6.1服务器程序实现的过程(1)服务器程序必须设置好LocalPort属性,作为侦听端口,该值为一个整数(只要是一个其它TCPIP应用程序没有使用过的值即可)。(2)使用Listen方法进入侦听状态,等待客户机程序的连接请求。(3)客户机程序发出连接请求,使服务器程序产生ConnectionRequest事件,该事件得到一个参数requestID。(4)服务器程序用Accept方法接受客户机程序的requestID请求。这样,服务器程序就可以用SendData方法发送数据了。Accept方法必须用上一步得到的requestID作为其参数。(5)当服务器程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。(6)如果接受到Close事件,则用Close方法关闭TCPIP连接1.服务器程序的源代码如下:PrivateSubCommand1_Click()IfIsConnectionOpen=FalseThenMsgBox未建立连接!如果未建立连接,就弹出这么一个对话框ElseWinsock1.SendDataText2.TextSocket发送数据EndIfEndSubPrivateSub_Load()Winsock1.LocalPort=1111Winsock1.ListenSocket在程序启动时监听端口1111Image1.Visible=FalseIsConnectionOpen=False开始状态为未连接EndSubPrivateSubWinsock1_Close()对方Socket关闭触发这个事件-20-Winsock1.Close关闭自己EndEndSubPrivateSubWinsock1_ConnectionRequest(ByValrequestIDAsLong)接收到对方连接请求触发这个事件IfWinsock1.StatesckClosedThenWinsock1.Close使Socket在接收连接请求之前保持关闭状态Winsock1.AcceptrequestIDWinsock1自己接收连接请求,与客户端Socket建立连接IsConnectionOpen=TrueImage1.Visible=True连接成功EndSubPrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong)收到

温馨提示

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

评论

0/150

提交评论