网络课程设计报告_第1页
网络课程设计报告_第2页
网络课程设计报告_第3页
网络课程设计报告_第4页
网络课程设计报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、 课程设计报告利用DELPHI实现IGMP协议系 别电子信息系专业名称计算机科学与技术班级学号4080117学生姓名徐本领指导教师曲荣欣成 绩2011年7月13日1设计题目利用DELPHI实现IGMP协议2目的要求(1) 了解IGMP协议的基本原理和功能(2) 熟悉DELPHI软件编程操作(3) 通过用DELPHI编程实现Internet组管理协议的基本功能3设计分析3.1IGMP协议Internet 组管理协议(IGMP)是因特网协议家族中的一个组播协议,用于IP主机向任一个直接相邻的路由器报告他们的组成员情况。IGMP信息封装在IP报文中,其IP的协议号为2。它用来在IP主机和与其直接相邻

2、的组播路由器之间建立、维护组播组成员关系。IGMP不包括组播路由器之间的组成员关系信息的传播与维护,这部分工作由各组播路由协议完成。所有参与组播的主机必须实现IGMP。参与IP组播的主机可以在任意位置、任意时间、成员总数不受限制地加入或退出组播组。组播路由器不需要也不可能保存所有主机的成员关系,它只是通过IGMP协议了解每个接口连接的网段上是否存在某个组播组的接收者,即组成员。而主机方只需要保存自己加入了哪些组播组。IGMP在主机与路由器之间是不对称的:主机需要响应组播路由器的IGMP查询报文,即以IGMP MEMBERSHIP REPORT报文响应;路由器周期性发送成员资格查询报文,然后根据

3、收到的响应报文确定某个特定组在自己所在子网上是否有主机加入,并且当收到主机的退出组的报告时,发出特定组的查询报文(IGMP版本2),以确定某个特定组是否已无成员存在。3.2IGMP如何封装在IP数据报中正如ICMP一样,IGMP也被当作IP层的一部分。IGMP报文通过IP数据报进行传输。不像我们已经见到的其他协议,IGMP有固定的报文长度,没有可选数据。图3-2显示了IGMP报文如何封装在IP数据报中。IP首部IGMP报文IP数据报20字节8字节3.3IGMP报文的字段格式图3-3显示了长度为8字节的IGMP的报文格式未用检验和4位IGMP版本(1)4位IGMP类型(1-2)03 47 815

4、 163132位组地址(D类IP地址)8字节这是版本为1的IGMP。IGMP类型为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。检验和的计算和ICMP协议相同。 组地址为D类IP地址。在查询报文中组地址设置为0,在报告报文中组地址为要参加的组地址。3.4加入一个多播组多播的基础就是一个进程的概念(使用的术语进程是指操作系统执行的一个程序),该进程在一个主机的给定接口上加入了一个多播组。在一个给定接口上的多播组中的成员是动态的它随时因进程加入和离开多播组而变化。这里所指的进程必须以某种方式在给定的接口上加入某个多播组。进程也能离开先前加入的多播组。这些是一个支持多播

5、主机中任何API所必需的部分。使用限定词“接口”是因为多播组中的成员是与接口相关联的。一个进程可以在多个接口上加入同一多播组。3.5IGMP报告和查询多播路由器使用IGMP报文来记录与该路由器相连网络中组成员的变化情况。使用规则如下: (1) 当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。 (2) 进程离开一个组时,主机不发送IGMP报告,即便是组中的最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的IGMP查询中就不再发送报告报文。 (3) 多播路由器定时发送IGM

6、P查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。因为路由器希望主机对它加入的每个多播组均发回一个报告,因此IGMP查询报文中的组地址被设置为0。 (4) 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。4详细设计4.1主机端设计界面4.2服务器端设计界面4.3主机加入服务器广播组4.4从服务器端查询主机4.5服务器向主机发送广播消息4.6主机收到服务器的广播消息4.7单个主机离开组播4.8主机离开后服务器再次广播4.9主机端显示离开的主机收不到广播消息5程序源代码5.1服务器端代码unit Un

7、it1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs , Buttons, StdCtrls, ExtCtrls, ColorGrd, Sockets, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,IdSocketHandle;type Tms = class(TForm) BitBtn1: TBitBtn; BitBtn2: TBitBtn; IdUDPCli

8、ent1: TIdUDPClient; IdUDPServer1: TIdUDPServer; Edit1: TEdit; ListBox1: TListBox; procedure FormShow(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); private

9、ComputerName: array0.127 of Char; Private declarations public Public declarations end;var ms: Tms; port: integer;implementation$R *.dfmprocedure Tms.FormShow(Sender: TObject);var sz: dword;begin /获得字符串的大小 port:= 101; sz := SizeOf(Computername); /得到本机的标识 GetComputerName(ComputerName,sz); Try /设定等待时间为

10、50ms IdUDPClient1.ReceiveTimeout:=50000; /设定远程目标主机的接收端口号为"101",可以为其他值 IdUDPClient1.Port:=101; /设定本地端口号为"100" IdUDPServer1.DefaultPort:=100; /打开UDP服务器,开始监听端口 IdUDPServer1.Active := true; except on E: Exception do begin E.Message := '出错:'#13#10+E.Message; raise; Application

11、.Terminate; end; end;end;procedure Tms.BitBtn1Click(Sender: TObject);varcodestr: String;begin listbox1.Items.Add('开始查询组内主机'); codestr:= 'Q1' /否则取得当前网友的主机名或者IP地址 idudpclient1.Host:=computerName; /将数据发送给远程主机 for port:= 101 to 110 do Try IdUDPClient1.Port:=port; idudpclient1.Send(codest

12、r); except on E: Exception do begin E.Message := '出错:'#13#10+E.Message; raise; Application.Terminate; end; end;end;procedure Tms.BitBtn2Click(Sender: TObject);varcodeStr: String;begin codeStr:= ' ' + edit1.Text; /否则取得当前网友的主机名或者IP地址 idudpclient1.Host:=computerName; /将数据发送给远程主机 for por

13、t:= 101 to 110 do Try IdUDPClient1.Port:=port; idudpclient1.Send(codestr); except end;end;procedure Tms.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);var codeStr,cs: String;begin /设置字符串的长度 SetLength(codestr, AData.Size); /把收到的数据写入字符串中 AData.Read(codestr1, AData.Size

14、); if codestr1 + codestr2 = 'RQ' then cs:='IP地址为224.0.0.' + codestr4 + codestr5 + codestr6 +'的主机在本组' if codestr1 + codestr2 = 'IN' then cs:='IP地址为224.0.0.' + codestr3 + codestr4 + codestr5 +'的主机已加入本组' if codestr1 + codestr2 = 'OU' then cs:='

15、;IP地址为224.0.0.' + codestr3 + codestr4 + codestr5 +'的主机已离开本组' listbox1.Items.Add(cs);end;end.5.2主机端代码unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdUDPClient, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer ,Id

16、SocketHandle, Buttons;type Tmc = class(TForm) Label1: TLabel; Edit2: TEdit; IdUDPServer1: TIdUDPServer; Label3: TLabel; BitBtn2: TBitBtn; BitBtn3: TBitBtn; IdUDPClient2: TIdUDPClient; procedure FormShow(Sender: TObject); procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSoc

17、ketHandle); procedure BitBtn2Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); private ComputerName: array0.127 of Char; Private declarations public Public declarations end; type chuan = class a,st,n1,n2,cs: word; end;var mc: Tmc;implementation$R *.dfmprocedure Tmc.FormShow(Sender: TO

18、bject);var sz: dword;dport: integer;begin dport:= 103; Try sz:= sizeof(Computername); GetComputerName(ComputerName,sz); /设定等待时间为50ms IdUDPClient2.ReceiveTimeout:=50000; /设定远程目标主机的接收端口号为"100",可以为其他值 IdUDPClient2.Port:=100; /设定本地端口号为dport的值 IdUDPServer1.DefaultPort:=dport; /打开UDP服务器,开始监听端口 l

19、abel3.Caption:= inttostr(IdUDPServer1.DefaultPort); except on E: Exception do begin E.Message := '出错:'#13#10+E.Message; raise; Application.Terminate; end; end;end;procedure Tmc.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);var codestr,re: String;begin /设置字符串

20、的长度 SetLength(codestr, AData.Size); /把收到的数据写入字符串中 AData.Read(codestr1, AData.Size); if codestr1 = 'Q' then re:= 'RQ1'+inttostr(IdUDPServer1.DefaultPort); idudpclient2.Host:=computerName; /将数据发送给远程主机 idudpclient2.Send(re); if codestr1 = ' ' then edit2.Text:= codestr;end;proced

21、ure Tmc.BitBtn2Click(Sender: TObject);var codeStr: string;begin IdUDPServer1.Active := true; codeStr:= 'IN' + inttostr(idudpserver1.DefaultPort); /否则取得当前网友的主机名或者IP地址 idudpclient2.Host:=computerName; /将数据发送给远程主机 idudpclient2.Send(codeStr);end;procedure Tmc.BitBtn3Click(Sender: TObject); var codeStr: string;begin codeStr:= 'OU' + inttostr(idudpserver1.DefaultPort); /否

温馨提示

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

评论

0/150

提交评论