网络课程设计报告4080117.docx

上传人:b****5 文档编号:5757666 上传时间:2023-01-01 格式:DOCX 页数:15 大小:151.65KB
下载 相关 举报
网络课程设计报告4080117.docx_第1页
第1页 / 共15页
网络课程设计报告4080117.docx_第2页
第2页 / 共15页
网络课程设计报告4080117.docx_第3页
第3页 / 共15页
网络课程设计报告4080117.docx_第4页
第4页 / 共15页
网络课程设计报告4080117.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

网络课程设计报告4080117.docx

《网络课程设计报告4080117.docx》由会员分享,可在线阅读,更多相关《网络课程设计报告4080117.docx(15页珍藏版)》请在冰豆网上搜索。

网络课程设计报告4080117.docx

网络课程设计报告4080117

 

课程设计报告

利用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主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。

IGMP不包括组播路由器之间的组成员关系信息的传播与维护,这部分工作由各组播路由协议完成。

所有参与组播的主机必须实现IGMP。

参与IP组播的主机可以在任意位置、任意时间、成员总数不受限制地加入或退出组播组。

组播路由器不需要也不可能保存所有主机的成员关系,它只是通过IGMP协议了解每个接口连接的网段上是否存在某个组播组的接收者,即组成员。

而主机方只需要保存自己加入了哪些组播组。

IGMP在主机与路由器之间是不对称的:

主机需要响应组播路由器的IGMP查询报文,即以IGMPMEMBERSHIPREPORT报文响应;路由器周期性发送成员资格查询报文,然后根据收到的响应报文确定某个特定组在自己所在子网上是否有主机加入,并且当收到主机的退出组的报告时,发出特定组的查询报文(IGMP版本2),以确定某个特定组是否已无成员存在。

3.2IGMP如何封装在IP数据报中

正如ICMP一样,IGMP也被当作IP层的一部分。

IGMP报文通过IP数据报进行传输。

不像我们已经见到的其他协议,IGMP有固定的报文长度,没有可选数据。

图3-2显示了IGMP报文如何封装在IP数据报中。

3.3IGMP报文的字段格式

图3-3显示了长度为8字节的IGMP的报文格式

这是版本为1的IGMP。

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服务器端代码

unitUnit1;

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;

procedureFormShow(Sender:

TObject);

procedureBitBtn1Click(Sender:

TObject);

procedureBitBtn2Click(Sender:

TObject);

procedureIdUDPServer1UDPRead(Sender:

TObject;AData:

TStream;

ABinding:

TIdSocketHandle);

private

ComputerName:

array[0..127]ofChar;

{Privatedeclarations}

public

{Publicdeclarations}

end;

var

ms:

Tms;

port:

integer;

implementation

{$R*.dfm}

procedureTms.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

onE:

Exceptiondo

begin

E.Message:

='出错:

'#13#10+E.Message;

raise;

Application.Terminate;

end;

end;

end;

procedureTms.BitBtn1Click(Sender:

TObject);

var

codestr:

String;

begin

listbox1.Items.Add('开始查询组内主机');

codestr:

='Q1';

//否则取得当前网友的主机名或者IP地址

idudpclient1.Host:

=computerName;

//将数据发送给远程主机

forport:

=101to110do

Try

IdUDPClient1.Port:

=port;

idudpclient1.Send(codestr);

except

onE:

Exceptiondo

begin

E.Message:

='出错:

'#13#10+E.Message;

raise;

Application.Terminate;

end;

end;

end;

procedureTms.BitBtn2Click(Sender:

TObject);

var

codeStr:

String;

begin

codeStr:

=''+edit1.Text;

//否则取得当前网友的主机名或者IP地址

idudpclient1.Host:

=computerName;

//将数据发送给远程主机

forport:

=101to110do

Try

IdUDPClient1.Port:

=port;

idudpclient1.Send(codestr);

except

end;

end;

procedureTms.IdUDPServer1UDPRead(Sender:

TObject;AData:

TStream;

ABinding:

TIdSocketHandle);

varcodeStr,cs:

String;

begin

//设置字符串的长度

SetLength(codestr,AData.Size);

//把收到的数据写入字符串中

AData.Read(codestr[1],AData.Size);

ifcodestr[1]+codestr[2]='RQ'then

cs:

='IP地址为224.0.0.'+codestr[4]+codestr[5]+codestr[6]+'的主机在本组';

ifcodestr[1]+codestr[2]='IN'then

cs:

='IP地址为224.0.0.'+codestr[3]+codestr[4]+codestr[5]+'的主机已加入本组';

ifcodestr[1]+codestr[2]='OU'then

cs:

='IP地址为224.0.0.'+codestr[3]+codestr[4]+codestr[5]+'的主机已离开本组';

listbox1.Items.Add(cs);

end;

end.

5.2主机端代码

unitUnit1;

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;

procedureFormShow(Sender:

TObject);

procedureIdUDPServer1UDPRead(Sender:

TObject;AData:

TStream;

ABinding:

TIdSocketHandle);

procedureBitBtn2Click(Sender:

TObject);

procedureBitBtn3Click(Sender:

TObject);

private

ComputerName:

array[0..127]ofChar;

{Privatedeclarations}

public

{Publicdeclarations}

end;

type

chuan=class

a,st,n1,n2,cs:

word;

end;

var

mc:

Tmc;

implementation

{$R*.dfm}

procedureTmc.FormShow(Sender:

TObject);

varsz:

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

onE:

Exceptiondo

begin

E.Message:

='出错:

'#13#10+E.Message;

raise;

Application.Terminate;

end;

end;

end;

procedureTmc.IdUDPServer1UDPRead(Sender:

TObject;AData:

TStream;

ABinding:

TIdSocketHandle);

var

codestr,re:

String;

begin

//设置字符串的长度

SetLength(codestr,AData.Size);

//把收到的数据写入字符串中

AData.Read(codestr[1],AData.Size);

ifcodestr[1]='Q'then

re:

='RQ1'+inttostr(IdUDPServer1.DefaultPort);

idudpclient2.Host:

=computerName;

//将数据发送给远程主机

idudpclient2.Send(re);

ifcodestr[1]=''then

edit2.Text:

=codestr;

end;

procedureTmc.BitBtn2Click(Sender:

TObject);

varcodeStr:

string;

begin

IdUDPServer1.Active:

=true;

codeStr:

='IN'+inttostr(idudpserver1.DefaultPort);

//否则取得当前网友的主机名或者IP地址

idudpclient2.Host:

=computerName;

//将数据发送给远程主机

idudpclient2.Send(codeStr);

end;

procedureTmc.BitBtn3Click(Sender:

TObject);

varcodeStr:

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].北京.清华大学出版社,2002

[2]谢希仁.计算机网络[M].北京.电子工业出版社,2008

[3]杨长春.Delphi程序设计教程[M].北京.清华大学出版社,2008

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1