资源描述
课程设计报告
运用DELPHI实现IGMP合同
系 别
电子信息系
专业名称
计算机科学与技术
班级学号
4080117
学生姓名
徐本领
指引教师
曲荣欣
成 绩
7月13日
1设计题目
运用DELPHI实现IGMP合同
2目规定
(1) 理解IGMP合同基本原理和功能
(2) 熟悉DELPHI软件编程操作
(3) 通过用DELPHI编程实现Internet组管理合同基本功能
3设计分析
3.1IGMP合同
Internet 组管理合同(IGMP)是因特网合同家族中一种组播合同,用于IP主机向任一种直接相邻路由器报告她们构成员状况。IGMP信息封装在IP报文中,其IP合同号为2。它用来在IP主机和与其直接相邻组播路由器之间建立、维护组播构成员关系。IGMP不涉及组播路由器之间构成员关系信息传播与维护,这某些工作由各组播路由合同完毕。所有参加组播主机必要实现IGMP。
参加IP组播主机可以在任意位置、任意时间、成员总数不受限制地加入或退出组播组。组播路由器不需要也不也许保存所有主机成员关系,它只是通过IGMP合同理解每个接口连接网段上与否存在某个组播组接受者,即构成员。而主机方只需要保存自己加入了哪些组播组。
IGMP在主机与路由器之间是不对称:主机需要响应组播路由器IGMP查询报文,即以IGMP MEMBERSHIP REPORT报文响应;路由器周期性发送成员资格查询报文,然后依照收到响应报文拟定某个特定组在自己所在子网上与否有主机加入,并且当收到主机退出组报告时,发出特定组查询报文(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)
0
3 4
7 8
15 16
31
32位组地址(D类IP地址)
8字节
这是版本为1IGMP。IGMP类型为1阐明是由多播路由器发出查询报文,为2阐明是主机发出报告报文。检查和计算和ICMP合同相似。 组地址为D类IP地址。在查询报文中组地址设立为0,在报告报文中组地址为要参加组地址。
3.4加入一种多播组
多播基本就是一种进程概念(使用术语进程是指操作系统执行一种程序),该进程在一种主机给定接口上加入了一种多播组。在一种给定接口上多播组中成员是动态—它随时因进程加入和离开多播组而变化。
这里所指进程必要以某种方式在给定接口上加入某个多播组。进程也能离开先前加入多播组。这些是一种支持多播主机中任何API所必须某些。使用限定词“接口”是由于多播组中成员是与接口有关联。一种进程可以在各种接口上加入同一多播组。
3.5IGMP报告和查询
多播路由器使用IGMP报文来记录与该路由器相连网络中构成员变化状况。使用规则如下:
(1) 当第一种进程加入一种组时,主机就发送一种IGMP报告。如果一种主机各种进程加入同一组,只发送一种IGMP报告。这个报告被发送到进程加入组所在同一接口上。
(2) 进程离开一种组时,主机不发送IGMP报告,即便是组中最后一种进程离开。主机懂得在拟定组中已不再有构成员后,在随后收到IGMP查询中就不再发送报告报文。
(3) 多播路由器定期发送IGMP查询来理解与否尚有任何主机包具有属于多播组进程。多播路由器必要向每个接口发送一种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 Unit1;
interface
uses
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;
IdUDPClient1: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
ComputerName:array[0..127] of Char;
{ Private declarations }
public
{ Public declarations }
end;
var
ms:Tms;
port:integer;
implementation
{$R *.dfm}
procedure Tms.FormShow(Sender:TObject);
var
sz:dword;
begin
//获得字符串大小
port:= 101;
sz := SizeOf(Computername);
//得到本机标记
GetComputerName(ComputerName,sz);
Try
//设定等待时间为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.Terminate;
end;
end;
end;
procedure Tms.BitBtn1Click(Sender:TObject);
var
codestr:String;
begin
listbox1.Items.Add('开始查询组内主机');
codestr:= 'Q1';
//否则获得当前网友主机名或者IP地址
idudpclient1.Host:=computerName;
//将数据发送给远程主机
for port:= 101 to 110 do
Try
IdUDPClient1.Port:=port;
idudpclient1.Send(codestr);
except
on E:Exception do
begin
E.Message := '出错:'#13#10+E.Message;
raise;
Application.Terminate;
end;
end;
end;
procedure Tms.BitBtn2Click(Sender:TObject);
var
codeStr:String;
begin
codeStr:= ' ' + edit1.Text;
//否则获得当前网友主机名或者IP地址
idudpclient1.Host:=computerName;
//将数据发送给远程主机
for port:= 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(codestr[1],AData.Size);
if codestr[1] + codestr[2] = 'RQ' then
cs:='IP地址为224.0.0.' + codestr[4] + codestr[5] + codestr[6] +'主机在本组';
if codestr[1] + codestr[2] = 'IN' then
cs:='IP地址为224.0.0.' + codestr[3] + codestr[4] + codestr[5] +'主机已加入本组';
if codestr[1] + codestr[2] = 'OU' then
cs:='IP地址为224.0.0.' + codestr[3] + codestr[4] + codestr[5] +'主机已离开本组';
listbox1.Items.Add(cs);
end;
end.
5.2主机端代码
unit Unit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,IdUDPClient,IdBaseComponent,IdComponent,IdUDPBase,
IdUDPServer ,IdSocketHandle,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:TIdSocketHandle);
procedure BitBtn2Click(Sender:TObject);
procedure BitBtn3Click(Sender:TObject);
private
ComputerName:array[0..127] of Char;
{ Private declarations }
public
{ Public declarations }
end;
type
chuan = class
a,st,n1,n2,cs:word;
end;
var
mc:Tmc;
implementation
{$R *.dfm}
procedure Tmc.FormShow(Sender:TObject);
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服务器,开始监听端口
label3.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
//设立字符串长度
SetLength(codestr,AData.Size);
//把收到数据写入字符串中
AData.Read(codestr[1],AData.Size);
if codestr[1] = 'Q' then
re:= 'RQ1'+inttostr(IdUDPServer1.DefaultPort);
idudpclient2.Host:=computerName;
//将数据发送给远程主机
idudpclient2.Send(re);
if codestr[1] = ' ' then
edit2.Text:= codestr;
end;
procedure 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);
//否则获得当前网友主机名或者IP地址
idudpclient2.Host:=computerName;
//将数据发送给远程主机
idudpclient2.Send(codeStr);
IdUDPServer1.Active := false;
end;
end.
6设计总结
本次网络课程设计,巩固了我所学计算机网络知识,进一步提高了我对问题分析能力和编程能力。同步,我也熟悉了Delphi软件基本操作,并可以编写某些简朴应用程序。
固然,在这次设计过程中,我遇到了各种各样不懂问题,然而也就是在一步一步解决这些问题过程中我发现了自己诸多局限性之处,对此前所学过诸多知识理解得不够深刻透彻,掌握得不够牢固。通过本次课程设计使我加强了对课上所学知识理解,加深了对许多器件功能结识,提高了我综合运用所学知识分析和解决实际问题能力。同步也加强了我实践能力并且这次课程设计使我懂得了理论与实际相结合重要性,熟悉理论知识是必要,然而也是远远不够,只有把所学理论知识与实践练习巧妙地相结合起来,从实践中得出结论,进而才干培养、提高自己实际动手能力和独立思考能力。
在咱们一起讨论课题、查找资料、调试程序和撰写报告过程中,我深刻体会到团队真正含义,团队需要个人,个人也离不开团队。一种团队工作必要发扬团结协作精神,团结协作是咱们成功一项非常重要保证。
7参照文献
[1] 王罡,林立志. 基于Windows TCP/IP编程[M]. 北京. 清华大学出版社,
[2] 谢希仁. 计算机网络[M]. 北京. 电子工业出版社,
[3] 杨长春. Delphi程序设计教程[M]. 北京. 清华大学出版社,
展开阅读全文