数据通信与计算机网络大型实验_第1页
数据通信与计算机网络大型实验_第2页
数据通信与计算机网络大型实验_第3页
数据通信与计算机网络大型实验_第4页
数据通信与计算机网络大型实验_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、数据通信与计算机网络大型实验实验一 网络连通性测试程序一、实验原理在Windows系统中,我们经常用Ping.exe来测试网络的连通性。 Ping的实现过程很简单,该命令将引发IP层发送一个简单的IP包,一般是32字节。而目的方收到这个包后,将源地址和目的地址变换一下,重新发送这个包即可,当然还要加一些超时机制。 可以用C+ Builder中的Powersock、NMEcho、NMDayTime和NMTime等控件来实现网络连接检测功能。 二、程序目标客户机连接到Internet上是使用因特网信息和服务的前提。本实例利用Powersock、NMEcho、NMDayTime和NMTime等控件来

2、测试一台客户机是否已经连接到Internet上。使用Powersock控件,测试它的LocalIP属性,如果返回值不是.0或,则表明连接成功。使用NMEcho控件,向服务器发送数据,如果能接收到服务器远程返回的信息,则表明连接成功。使用NMDayTime控件获取服务器上的日期或时间,如果得到正确的结果,则表明连接成功。使用NMTime控件,以另一种数据格式获取服务器上的日期和时间,与使用NMDayTime一样,如果得到正确结果,则表明连接成功。三、部分参考过程首先定义以下控件: 三个Edit控件:一个用于接收远程主机的IP地址或域名,一个用于接收用户设置的超时机制的时间,一个

3、用于设置端口号。 两个RichEdit控件:一个用于给远程主机发送信息,一个用于接收来自远程主机的信息。 两个CheckBox控件:用于用户是否自己设定端口号。 一个Button控件:用于执行测试。 一个StatusBar控件:用于显示应用程序的状态。 程序实现代码如下: void _fastcall TForm1:Button1Click(TObject ender) /设置NMEcho控件的标准TCP/IP属性 NMEcho1-Host=Edit1-Text ; NMEcho1-TimeOut=StrToInt(Edit2-)Text) ; if(CheckBox1-)Checked) N

4、MEcho1-Port=StrToInt(Edit3-)Text); else NMEcho1-Port=7; /TCP/IP中Echo的默认端口号 NMEcho1-ReportLevel=Status_Basic; NMEcho1-Connect(); /建立连接 RichEdit2-Clear (); for(int i=0;i /RichEdit1用于给远程主机发送信息 RichEdit2-)Text=RichEdit2-Text +NMEcho1-Echo(RichEdit1-)Lines- Stringsi; NMEcho1-Disconnect (); 注意:在调用NMEcho控件

5、的Connect()方法时,应该确保在接收数据之前连接已经建立。当调用Connect()方法后,如果用户输入的是域地址而不是IP地址,且域名服务器成功地解析了这个域名,将触发控件的OnHostResoved事件,在此事件的处理中,我们将解析成功的消息在状态栏中显示给用户。具体实现代码如下: void _fastcall TForm1:NMEcho1HostResolved(TComponent ender) StatusBar1-Panels-Items0-Text="Host Resolved!" 如果用户输入的远程主机不正确,将触发控件的OnInvalidHost事件,

6、在此事件的处理中,弹出对话框要求用户重新输入远程主机的IP地址或域名地址,然后试图与服务器重建连接。具体代码如下: void _fastcall TForm1:NMEcho1InvalidHost(bool &&Handled) AnsiString s; if(InputQuery("Invailid host!","Specify a new host:",s) NMEcho1-Host=s; Handled=true; 建立连接后,将触发控件的OnConnect事件,在此事件的处理中,我们将连接成功的消息在状态栏中显示给用户。具体实

7、现代码如下: void _fastcall TForm1:NMEcho1Connect(TObject ender) StatusBar1-Panels-Items0-Text="Echo has connected host!" 如果在调用Connect()方法后,在超时时间仍然没有与服务器连接,将触发控件的OnConnectFailed事件,在此事件的处理中,我们将连接失败的消息显示给用户。具体实现代码如下: void _fastcall TForm1:NMEcho1ConnectionFailed(TObject ender) ShowMessage("Co

8、nnection failed!"); 除了NMEcho控件可以实现以上功能外,NetMaster的NMDayTime、NMTime这两个控件也能实现。方法与NMEcho控件一样,区别是NMDayTime和NMTime这两个控件不用首先调用Connect()方法,它们与服务器的连接是在使用DayTimeStr、TimeStr属性时自动进行的。实验二 UDP数据报系统一、 NMUDP的功能NMUDP的主要功能是在网络下使用UDP传送数据信息。具体来说,能够实现:发送UDP数据使用UDP发送数据报,先要正确指定接收数据的远程主机的地址和端口号,分别设置RemoteHost和Reomote

9、Port属性。然后使用控件的SendBuffer方法向远程主机发送字符数组,或使用SendStream方法发送数据流。接收UDP数据接收UDP数据前,先要正确设置本地端口号(LocalPort)属性。此属性必须在设计期间赋值且在运行中不能改变。当本机收到UDP数据时,触发控件的OnDataAvailable事件。在此事件的处理函数中,调用ReadBuffer方法将数据读入缓冲区,或者调用ReadSrtream将数据读入数据流中。二、 NMUDP的属性、方法和事件NMUDP直接继承于Tcomponent,主要的属性、方法和事件如下。1、 属性LocalPort声明:property LocalP

10、ort:integer;指定一个监听接收到数据报的端口号。如果设置为0,则收不到数据。RemoteHost声明:property RenoteHost:string;接收用户发送的数据报的远程主机名或IP地址。RemotePort声明:property Remote:integer;接收用户用SengStream和SendBuffer方法发送的数据报的远程主机端口号。ReportLevel声明:property ReportLevel:integer;指定状态信息的详细程度。可取值有Status_None、Status_Informational、Status_Basic、Status_Rou

11、tines、Status_debug和Status_Trace,默认值为Status_Informational。2、方法SendBuffer声明:procedure SendBuffer(Buff:array of char;length:integer);将存储在字符数组中的数据发送到远程主机。参数Buff指定要发送的数组;length指定Buff中数据的大小。如果Buff中没有数据,将触发OnBufferInvailid事件。ReadBuffer声明:procedure ReadBuffer(var Buff:array of char;var length:integer);读取Buf

12、fer中收到的UDP数据。参数Buff指定一个读入数据的缓冲区;length指定欲读取数据的大小。Buff设置不能小于接收数据大小,否则将触发接收异常。SendStream声明:procedure SendStream(DataStream:Tstream);向远程主机发送来的数据流。参数DataStream指定要发送的数据流。如果没有数据,将触发OnStreamInvalid事件。ReadStream声明:procedure ReadStream(Data Stream:Tstream);读取从远程主机发送来的数据流中的UDP数据。参数DataStream指定接收的数据流。如果以数据流传送的

13、流没有初始化,将触发异常。3、事件OnDataSend声明:property OnDataSend:TNotifyEvent;typedef void_fastcall(_closure*TnotifyEvent)(System:Tobject*Sender);使用SendStream或SendBuffer方法传送数据报成功时触发。此方法保证数据发送出而不保证远程主机接收到,因为UDP协议没有确认机制。OnDataReceived声明;property OnDataReceived:TonReceive;TonReceive=procedure(Sender:Tcompontent;Numbe

14、rBytes:Integer;FromIP:string;Port:integer);接收到来自远程主机的数据时触发。事件参数:NumberBytes指明收到的字节数;FromIP指明发送数据的计算机地址;Port指明数据来源端口。 OnBufferInvalid声明:property OnBufferInalid:TbufferInvalid;TbufferInvalid=procedure(var handled:Boolean;var Buff:array of char;var length:integer);调用SendBuffer方法时,如果Buffer中没有数据则触发此事件。事件

15、参数:Buff指定将发送的数据缓冲区;length指定缓冲区大小。修改这两个参数可以获取一个合法的数据缓冲区。如果handled参数设置为True,则重新发送缓冲区数据,否则引起异常。OnStreamInvalid声明:property OnSrreamInvalid:TstreamInvalid;TstreamInvalid=procedure(var handled:Boolean;Srream:Tstream);使用SendSrream 方法发送数据,而数据流为空时触发此事件。事件参数:Stream参数指为空的数据流。重装数据后,如果handled参数设置为True,则重新发送数据流,否

16、则引起异常。OnInvalidHost声明:property:ThandlerEvent;ThandlerEvent=procedure(var handled:Boolean);指定的远程主机非法时触发。事件参数:如果handled参数设置为True,再次发送数据,若仍失败则引起异常。如果handled参数设置为False(默认值),则引起异常。OnStatus声明:property:Tonstatus;TonStatus=procedure(Sender:Tcomponent;status:string);控件状态变化时触发此事件。事件参数:参数status指明控件当前状态。三、程序目标使

17、用NMUDP控件,创建一个可以接收和发送UDP数据报(包括用户数据报流)的应用程序。实验三 网络聊天程序的开发一、Winsock概述WinSock是一组API,用于在Internet上传输数据和交换信息。虽然现在有很多现成的工具(如Web浏览器、FTP程序)可以实现在Internet上传输数据和文件,但通过WinSock编程可以获得更大的灵活性,而且不需考虑网络的连接细节。用WinSock编程本来是很麻烦的,但CBuilder中并不需要直接与Winsock的API打交道,因为ClientSocket和SeverSocket控件封装了Winsock的大部分API,使得对Winsock的访问大大简

18、化了。如果通过Internet传输数据,则至少需要一对Socket。其中,一个Socket在客户端,另一个在服务器端。一旦客户端和服务器端都接通了Socket,客户端和服务器端就可以相互通信,就好象墙上的电话插孔一样。用Socket建立的连接是建立在TCP/IP协议基础上的,同时也支持其他相关的协议,如XNS、DECnet及IPX/SPX等。根据连接发起的方式以及本地Socket要连接的目标,Socket之间的连接可以分为三种类型:客户端连接、监听连接和服务器端连接。所谓客户端连接,是指由客户端的Socket提出连接请求,要连接的目标是服务器的Socket。为此,客户端的Socket首先要描述

19、它要连接的服务器端的Socket,主要是服务器端Socket的地址和端口号,然后再定位所要连接的服务器端Socket。找到以后,就向服务器端Socket请求连接。此时,如果服务器端的Socket不是处于准备好状态,就会自动维护一个客户请求的队列,在它认为是适当时向客户端发出“允许连接”(Accept)信号。这时,客户端Socket与服务器端Socket的连接就建立了。所谓监听连接,是指服务器端Socket并不定位具体的客户端Socket,而是处于等待连接的状态。当服务器端Socket监听到或接收到客户端Socket的连接请求时,它就响应客户端Socket的请求,建立一个新的Socket句柄并与

20、客户端连接,而与服务器端Socket继续处于监听状态,这样就可以继续监听其他客户端Socket的连接请求。所谓服务器端连接,是指当服务器端Socket接收到客户端Socket的连接请求事,就把服务器端Socket的描述发给客户端。一旦客户端确认了此描述,连接就建立了。二、C+Builder中Socket编程C+Builder分别用ClientSocket和ServetSocket控件来操纵客户端Socket与服务器端Socket的连接和通信。这两个控件用于管理客户端和服务器端的连接,它们本身并不是Socket对象。操纵Socket对象的是TcustomWinSockete及其派生类,如Tcli

21、entWinSocket、TserverWinSocket、TserverClientWinSocket等。使用CBuilder进行Socket编程,首先需要分别建立服务器端Socket和客户端Socket,介绍如下。1、 建立服务器端Socket把一个SeverSocket控件放在表单或数据模块上,应用程序就变成一个TCP/IP服务器。当服务器处于监听状态时,用TserverWinSocket来操纵服务器端的Socket对象。当客户端提出连接请求,服务器接收请求并建立连接时,用TserverClientWinSocket来操纵服务器端Socket与客户端Socket的连接。要使服务器能监听客

22、户的连接请求,首先要设置TserverSocket的Port属性指定端口号。如果服务器提供的是标准的TCP/ip服务(如FTP、HTTP等,这些标准服务的端口号是事先指定的),只要设置TserverSocket的Service属性指定服务器类型,端口号就隐含确定了。如果同时设置了Port和Service属性,Port属性将被忽略。指定了端口号或由Service属性隐含指定的端口号后,就可以调用ServerSocket控件的Open开始监听。如果在设计期间将Active属性设置为Ture,在服务器程序启动时就会自动进入监听状态,即将Active属性设置为Ture与调用Open是等价的。一旦进入了

23、监听状态,就可以通过ServerSocket控件的Socket属性返回服务器端Socket对象,并由此对象获得有关连接的信息。例如,通过Socket对象的SocketHandle属性可以获得Socket的Windows句柄,供直接调用Socket的API需要时使用。而Socket的Handle属性可以访问从Socket连接检索消息的窗口。服务器进入监听状态后,当客户端提出连接请求时,服务器就自动接收请求,然后建立连接并触发OnClientConnect事件。此时,服务器端Socket与客户端Socket的连接由TserverWinSocket来操纵。TserverWinSocket的Conne

24、ctions属性可以返回一个数组,该数组由服务器当前活动的连接(TserverClientWinSocket)组成。如果要断开连接,只需在服务器端调用Close或者将Active属性设置为False即可。需要注意的是,这将导致氖对客户的连接都断开,并退出监听状态。如果在客户端调用Close,就会只断开该客户与服务器的连接,而不影响其他客户的连接ServerSocket控件的继承关系:Tcomponet->TabstractSocket->TcustomSocket->TcustomServerSocket->TserverSocket由此可见,ServerSocket控

25、件是典型的非可视控件。TcustomSocket是TserverSocket的虚基类,不能直接创建tcustomSocket的实例。2、 建立客户端Socket如果把一个ClientSocket控件放在表单或数据模块上,应用程序就会变成一个TCP/IP客户端。此时,利用TclientWinSocket操纵客户端的Socket对象。如果把ServerSocket控件和ClientSocket控件放在同一个表单或数据模块上,应用程序就具有TCP/IP服务器和客户两种角色。ClientSocket控件的Host属性用于指定服务器的主机名,如这种方式比较直观,但要花费域名解析的时间。如果用Sddres

26、s属性直接指定主机的IP地址,如3,这样可以省略域名解析。如果同时设置了Host属性和Address属性,Address属性将被忽略。如果要连接服务器,还需指定服务器端所使用的端口号。有两种方式可以指定服务器端所使用的端口号:一是直接设置Port属性;二是设置Service属性隐含确定端口号。如果同时设置了Port和Service属性,Port属性将被忽略。指定了服务器端的主机名或IP地址以及端口号后,如果调用ClientSocket控件的Open方法或者把Active属性设置为True,客户端Socket就会向服务器端提出连接请求。如果服务器端Socket处于监听状态

27、,就会自动接收请求并建立连接。一旦连接了服务器端的Socket,就可以用ClientSocket控件的Socket属性返回客户端的Socket对象(TclientWinSocket),并由此获得有关连接的信息。例如,Socket对象的SocketHandle属性可以获得Socket的Windows句柄,供直接调用Socket的API需要时使用。而Socket的Handle属性可以访问从Socket连接中检索消息的窗口。通过Socket的AsyncStyles属性,可以设置要捕捉哪些信息。在客户端断开连接是通过调用ClientSocket控件的Close方法实现的。此时,服务器端将触发OnCli

28、entDisconnect事件,而客户端将触发OnDisconnect事件。ClientSocket控件的继承关系和ServerSocket控件的继承关系一样的。因此,ClientSocket控件也是一个典型的非可视控件。3、 用Socket实现在网络上传输数据在服务器Socket与客户端Socket建立连接后,就可以通过Internet传输数据和文件了。这里先要介绍WinSock中的“阻塞”和“非阻塞”概念。在Windows环境下,一般采用非阻塞方式。对于客户端Socket,如果把ClientType属性设置为ctNonBlocking,就表示采用非阻塞方式连接。当服务器端Socket试图进

29、行读或写时,客户端Socket就会得到通知,触发OnRead或OnWrite事件。类似地,对于服务器端,如果把ServerType属性设置为stNonBlocking,则表示采用非阻塞方式连接。当客户端Socket试图进行读或写时,服务顺端Socket就会得到通知,触发OnClientRead或OnClientWrite事件。在处理上述事件的句柄中,都有一个Socket参数,它就是服务器端或客户端的Socket对象,其类型是TclientWinSocket、TserverWinSocket或TserverClientWinSocket。这些Socket对象的共同基类是TcustomWinSoc

30、ket。TcustomWinSocket提供了在Internet上传输数据的。如果要读取数据,可以调用ReceiveBuf或BeceiveText;如果要发送数据,可以调用SendBuf、SendStream、SendText或SendStreamThenDrop。SendStreamThenDrop能够在发送完数据后自动断开Socket的连接。SendStream和SendStreamThenDrop适合于发送流对象(如文件)。不过,程序并不需要显示地删除对象,加为当Socket连接断开时,Socket会自动释放所有的流对象。与非阻塞方式不同的是,在阻塞方式下没有像OnRead或OnWrit

31、e等的异步事件,Socket必须主动去读或写数据。在读或写数据操作完成之前,其他代码无法执行,应用程序处于等待状态。所以,阻塞方式不可避免地会影响整个应用程序的性能。对于客户端Socket,如果把ClientType属性设置为ctBlocking,表示采用阻塞方式连接。为了尽可能减少阻塞方式的副作用,可把所在涉及到读写的操作放在一个单独的线程中。这样,在32位的Windows环境下可以继续执行其他线程。当然,如果在读写过程中客户程序本身没有其他事情,就不必创建一个线程。对于服务器端Socket,如果把ServerType属性设置为stThreadBlocking,则表示采用阻塞方式连接。C+B

32、uilder将为每一个阻塞方式的连接自动分配一个新的线程。这样,即使有某个客户正在进行读写操作,其他客户也不必等待。服务器端Socket用TserverClientThread对象来操纵每一个线程。当线程开始执行时,它就检查位于另一端的客户是否正在试图进行写。若是,就触发OnClientRead事件;否则,触发OnClientWrite事件主服务器去写。实际上,这种用线程对象管理连接的方式可以认为是“假阻塞”方式。就服务器端而言,其编程非常类似于非阻塞方式;而客户端则需使用TwinSocketStream对象来判断服务器是否已准备好读或写。TwinSocketStream对象具有超时保护机制,

33、用以保证服务器和客户的同步,防止应用程序锁死。用TwinSocketStream对象进行读或写时,如果20秒内操作还没有完成,就认为超时而自动断开连接。注意:TwinSocketStream对象不能用于非阻塞方式。从上面的叙述可以看出阻塞和非阻塞方式的重要区别。在阻塞方式下,读或写是主动的,应用程序可以在读或写后安全地关闭Socket的连接;而在非阻塞方式下,读或写是随机的,Socket必须经常保持连接才能捕捉到异步事件。4、 TcustomWinSocketTcustomWinSocket是Socket对象的基类。编写WinSock应用程序有时需要直接操纵Socket对象,加此,这里先介绍T

34、customWinSocket。1) 声明在SCKTCOMP单元中,TcustomWinSocket有三个派生类。其中,TclientWinSocket用于操纵客户端的Socket对象;TserverClientWinSocket用于操纵已经与客户端建立连接的服务器端的Socket对象;而TserverWinSocket用于操纵监听方式下的服务器端的Socket对象。2) 属性Addr声明:property sockaddr_in Addr=read=Faddr;此属性是只读属性,返回本地Socket使用的端口号。其什由参数LocalAddress和LocalPort属性决定。AsyncSty

35、les声明:property TasyncStyles AsyncStyles = read = FasyncStyles,write =SetAsyncStyles, nodefault ;此属性用于设置Socket对象可以接收到哪些异步事件,这此事件(消息)将传递给Handle属性所返回的窗口。TasyncStyles本身是一个集合,可以包含下列元素:asRead表示已准备好读时:asWrite表示已准备好写时:asOOB表示当超出带宽的数据到达时;asAccept表示当另一个Socket请求连接时;asConnect表示当连接了另一个Socket时;而asClose表示当与另一个Sock

36、et断开连接时。注意:如果Socket是非阻塞方式,则AsyncStyles至少应该包含asRead和asWrite。Connected声明:property bool Connected=read=Fconnected, nodefault;表明Socket连接状态。其值为True时,表示已建立Socket连接并可用;否则,Socket关闭并可改变。打开客户端Socket可以使用Open方法;打开服务器端Socket可以使用Listen方法。Data声明:property void * Data = read=Fdata,write=Fdata;此特性是个无类型指针,指向一个应用程序专用的数

37、据结构。在该数据结构中可能包含了有关客户端的信息,服务器端Socket用此信息来判断客户端的连接请求。Handle声明:property HWND Handle =read=GetHandle,nodefault;Socket把接收的异步事件以Windows消息形式发送给此句柄。LocalAddress声明:property System:AnsiString LocalAddress = read=GetLocalAddress;返回一个用点分十进制记法表示的本地IP地址,如“”等。一台计算机可以有多个IP地址,每个IP地址可以同时用于多个Socket连接,但每一个So

38、cket连接的端口号(LocalPort)必须是相异的,以区别于同一IP地址的其他连接。LocalHost声明:property System:AnsiString LocalHost = reak=GetLocalHost;此属性以字符方式返回本地Socket的名称,例如http:/www.Zjc.Z。它为在LocalAddress属性中指定的本地IP地址提供别名。在Intranet中通常提供主机IP地址。LocalPort声明:property int LocalPort =read =GetLocalPort,nodefault;本地Socket的端口号。许多标准的服务都有固定的端口号,

39、如果要检查一个端口号是否属于标准服务所专用的,可以调用LookupService函数。当连接到另一个Socket的客户端和服务器时,LocalPort通常是在连接时随机指定的。同一个IP地址可以同时用于多个Socket连接,但每个连接的端口号必须是相异的,即LocalAddress和LocalPort属性的组合总是惟一的。RenoteAddr声明:property sockaddr_in RemoteAddr =read=GetRemoteAddr;返回本地Socket所连接的另一端Socket的Internet地址。它是RemoteAddress属性和RemotePort属性的组合。RemoteAd

温馨提示

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

评论

0/150

提交评论