资源描述
沈航北方科技学院
课程设计任务书
教 学 部 工学一部 专业 网络工程
课程设计题目 透明网桥模拟
班级 B941111 学号 B94111133 姓名 赵力翔
课程设计时间: 2011 年 12 月 19日至 2011 年 12 月 31 日
课程设计的内容及要求:
(一)主要内容
设计一个程序模拟透明网桥的工作过程:
1、 以一个合适的方法输入一个由网桥连接的各网段所形成的碰撞域
2、 设计各域中主机间发送信息的过程;
3、 模拟网桥的自学习方法,更新转发表;
4、 可以查询各网桥的转发表。
(二)基本要求
1、 系统采用VB或VC++作为开发工具,数据库应用Access或SQL Sever 2000;
2、 独立完成系统的设计、编码和调试,通过指导教师当场验收;
3、 交出完整的课程设计报告。
(三)主要参考书
[1] 萨师煊,王珊.数据库系统概论(第四版).北京:高等教育出版社,2006.5
[2] 刘瑞新,汪远征等.Visual Basic程序设计教程.北京:机械工业出版社, 2006.8
[3] 孔鹏等.Visual C++完全学手册.北京:机械工业出版社,2007.1
[4] 杨继平,吴华.SQL Server 2000自学教程.北京:清华大学出版社,2000.11
[5] 许家珆. 软件工程——理论与实践.北京: 高等教育出版社,2004.7
(四)评语
(五)成绩
指导教师 刘峰 2011 年 12 月 19 日
负责教师 年 月
II
透明网桥模拟
赵力翔
目录
摘 要 1
1.绪论 2
2. 系统分析 2
2.1 功能需求 2
2.2数据需求 2
2.3 性能需求 2
3. 总体设计 3
3.1功能模块设计 3
3.2系统设计方案 4
4. 详细设计和实现 4
4.1 透明网桥建立模块 4
4.2转发表显示与更新模块 5
5. 调试与测试 7
5.1 调试 7
5.2 测试 8
6. 结论 8
结束语 8
参考文献 9
附录1-用户手册 10
附录2-源程序 12
透明网桥模拟
摘 要
透明网桥的模拟程序设计,可以使透明网桥的工作进程模拟出来,使得网桥的工作过程的理解更容易,更方便,更直观,同时此程序浏览起来简洁方便,给用户的学习理解带来了便捷。
本系统使用VC MFC作为开发软件,实现了透明网桥的工作原理模拟,转发表的更新,转发表的查询以及网桥间的信息发送。
本文从分析课题的题目背景、题目意义、题目要求等出发,分别从需求分析、总体设计、详细设计、测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。
关键词:网桥;转发表;源地址;目标地址;
1.绪论
随着经济的发展,社会的进步,互联网已经普及到千家万户,对于互联网的学习和了解已经越来越迫切。此程序的开发,可以简洁方便的了解互联网的协议的一种——透明网桥的模拟,通过操作的过程,可以深入的了解网桥的工作过程和原理,通过简单的界面操作把书本中的知识迅速的转化为自己的技能。本程序可以最大限度的了解此协议,高效率的完成学习的目的。
根据课程设计任务书要求,本系统开发主要完成以下功能和性能。
(1) 实现透明网桥的基本功能,源地址发送及目标地址的;
(2) 更新转发表;
(3) 查询转发表;
(4) 输入网桥位置。
2. 系统分析
2.1 功能需求
本程序主要是模拟透明网桥工作的原理的操作系统。
该程序需要有查看(查看当前转发表),更新信息(更新当前转发表信息),输入网桥的位置信息功能(输入目标地址与源地址)。
2.2数据需求
透明网桥的基本信息为:当前网桥的位置,源地址位置,目标地址的位置,网桥接口。
2.3 性能需求
在运行时,此程序可以简单快捷的输入信息以及对网桥进行查看及更新转发表以及对应的各种操作,省去了繁琐复杂的脑力劳动,同时此程序表现出稳定性好,响应速度快,可靠性高,安全性强的特点。
3. 总体设计
3.1功能模块设计
根据分析整个系统主要划分为3个功能模块,分别执行要求中的功能。该系统需要有网桥的构建,输入目标地址及源地址,转发表的显示查看及更新。功能模块图如图1所示。
图1功能模块图
(1)网桥的建立模块
用适当的方式输入一个透明网桥,显示各个地址,网桥位置,以及接口信息。
(2) 信息输入模块模块
根据第一步建立的转发表,合理的输入源地址与目标地址。
(3) 转发表的操作模块
该模块分为:
①转发表的显示模块:
根据源地址及目标地址,显示转发表内容。
②转发表的更新模块:
根据输入的不同的源地址与目标地址,更新转发表的内容,并有显示模块显示出来。
3.2系统设计方案
(1) 建立
建立一个合理的透明网桥。
(2) 更新
根据目标地址与源地址,更新转发表中的内容。
(3) 查看
查看转发表中的内容。
4. 详细设计和实现
4.1 透明网桥建立模块
在电脑中构建一个合理的透明网桥结构。其中分为网桥、接口、地址三个主要的对象,并且建立与网桥相对应的空白转发表。程序流程如图2所示。
图2透明网桥建立流程图
4.2转发表显示与更新模块
输入目标地址与源地址,根据不同的地址,显示转发表。程序流程如图3所示。
图3 转发表显示过程流程图
当输入的源地址为网桥的两边输入时。程序流程如图4所示。
图4 转发表流程图1
当输入的源地址为网桥的中间时。程序流程如图5所示。
图5 转发表流程图2
5. 调试与测试
5.1 调试
调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者者来说也是最艰巨的任务。调试的任务是及时改正测试过程中发现的软件错误。具体地说,调试过程由两个步骤组成,它表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。然后仔细研究推断代码以确定问题的原因,并设法改正。
调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。本系统调试过程中遇到问题、原因和解决方法如下面介绍。
(1)在输入目标地址与源地址数据时,必须按照图上所示,正确输入,由于输入不正确,程序将会进行提示,然后重新输入。
(2)显示转发表时,由于没将之前的进行累加,所以出现了只显示当前转发表的情况。加入了数组存数累加之后,正确的显示了转发表的输出结果。
(3) 在转发表更新时,要主意前面一个转发表是否丢弃,如果前一个转发表丢弃,后一个转发表则不显示任何内容。
5.2 测试
软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例,并利用这些测试用例去运行程序,以发现程序错误或缺陷。过度测试则会浪费许多宝贵的资源。到测试后期,即使找到了错误,然而付出了过高的代价。
测试数据过程如下。
在程序运行的开始之前先确定地址信息,根据地址信息输入源地址与目标地址,由目标地址及源地址对应网桥的接口,判断是否转发,或者直接丢弃,判断之后,数据被存入数组中,在最后,更新转发表,即输出数组中的值。
6. 结论
课程设计顺利完成,任务书中所提出的要求全部实现,可以实现透明网桥工作原理直观观看,可以显示转发表,更新转发表,智能的输出。不过这个程序还有些不够完善,程序还有待改进。
结束语
为期两周礼拜的透明网桥模拟课程设计实习终于顺利完成,在这期间付出汗水,辛劳可是一言难尽。但是在付出的同时我门也在收获着,我们收获了宝贵的实践经验,并且能够熟练的掌握透明网桥的工作原理,能够熟练的运用学到的函数,学会了在曾经编写过的函数上加以修改实现了我期望实现的功能。此次课设实践充分的贯穿了整个学期所学到的知识,让脑海里的知识大清洗,继续加深巩固已经学到的知识,并且能够达到可以熟练运用的地步。对于现在的我们来说,我们已经经历了一个了解计算机网络,喜欢计算机网络的过程,但是我已经跨过了许多的障碍,所以我坚信我们接下来的路上的困难是难不倒我们的,在接下来的学习实践中我们会不断的对自己进行充电,使知识的羽翼更加丰满。或许在刚开始的学习中并未意识到知识的重要性,使得在后来的课设时期我们经历了艰难的时期,所以下一步我们要稳扎稳打,对最基本的知识进行认真的研习,在了解的基础上,深入的学习一些计算机网络的知识,为以后夯实基础!
参考文献
[1] 萨师煊,王珊.数据库系统概论(第四版).北京:高等教育出版社,2006.5
[2] 杨继平,吴华.SQL Server 2000自学教程.北京:清华大学出版社,2000.11
[3]孔鹏等.Visual C++完全学手册.北京:机械工业出版社,2007.1
[4]杨继平,吴华.SQL Server 2000自学教程.北京:清华大学出版社,2000.11
[5] 许家珆. 软件工程——理论与实践.北京: 高等教育出版社,2004.7
23
透明网桥模拟
附录1-用户手册
点击运行,首先显示该系统的主界面,如图4所示。
图4系统主界面
输入目标地址及源地址,并单击确认,如图5所示。
图5 查看转发表界面
再次输入目标地址与源地址,对B1,B2转发表进行相应的更新,如图6所示。
图6 更新转发表界面
附录2-源程序
#include "stdafx.h"
#include "jw.h"
#include "jwDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int i=0;
int a[10][3]={0};
int b[10][3]={0};
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
CJwDlg::CJwDlg(CWnd* pParent /*=NULL*/)
: CDialog(CJwDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CJwDlg)
m_head = _T("");
m_last = _T("");
m_B1 = _T("");
m_B2 = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CJwDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CJwDlg)
DDX_Text(pDX, IDC_EDIT1, m_head);
DDX_Text(pDX, IDC_EDIT2, m_last);
DDX_Text(pDX, IDC_EDIT3, m_B1);
DDX_Text(pDX, IDC_EDIT4, m_B2);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CJwDlg, CDialog)
//{{AFX_MSG_MAP(CJwDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CJwDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
return TRUE; // return TRUE unless you set the focus to a control
}
void CJwDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
void CJwDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CJwDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CJwDlg::OnButton1()
{
//1为转发,2为丢弃 [0]为地址,[1]为接口,[2]为转丢
UpdateData();
int j=0,k=0,l=0,m=0,q=0,c1[3]={0},c2[3]={0};
CString stra,strb;
CString str1;
CString str2;
GetDlgItem(IDC_EDIT1)->GetWindowText(str1);
GetDlgItem(IDC_EDIT2)->GetWindowText(str2);
c1[3]=str1[0],c2[3]=str2[0];
if((str1[0]=='A')||(str1[0]=='B'))
{
if(i==0)
{
for(j=0;j<3;j++)
{
if(j==0)
{
a[i][j]=b[i][j]=str1[0];
}
if(j==1)
a[i][j]=b[i][j]=1;
if(j==2)
{
a[i][j]=b[i][j]=1;
break;
}
}
}
else
for(m=0;m<10;m++)
{
if(a[m][0]==c1[3])
{
for(k=0;k<10;k++)
{
if(a[k][0]==c2[3])
{
if(a[k][1]==a[i][1])
{
a[k][2]=2;
break;
}
else
{
for(l=0;l<10;l++)
{
if(b[l][0]==c1[3])
break;
if(b[l][0]==0)
{
b[l][0]=str1[0];
b[l][1]=1;
b[l][2]=1;
break;
}
}
}
}
}
}
else
if(a[m][0]==0)
{
for(j=0;j<3;j++)
{
if(j==0)
{
a[i][j]=b[i][j]=str1[0];
}
if(j==1)
{
a[i][j]=1;
b[i][j]=1;
}
if(j==2)
{
for(k=0;k<10;k++)
{
if(a[k][0]==c2[3])
{
if(a[k][1]==a[i][1])
{
b[i][1]=0;
a[i][2]=2;
break;
}
else
{
for(l=0;l<10;l++)
{
if(b[l][0]==c1[3])
break;
if(b[l][0]==0)
{
b[l][0]=str1[0];
b[l][1]=1;
b[l][2]=1;
break;
}
}
if(b[i][1]==1)
{
b[i][2]=2;
}
}
}
else
{
if(b[i][1]!=1)
{
b[i][2]=1;
}
a[i][2]=1;
}
}
}
}
}
}
}
else
if((str1[0]=='C')||(str1[0]=='D'))
{
for(j=0;j<3;j++)
{
if(j==0)
{
a[i][j]=b[i][j]=str1[0];
}
if(j==1)
{
a[i][j]=2;
b[i][j]=1;
}
if(j==2)
{
a[i][j]=b[i][j]=1;
for(m=0;m<10;m++)
{
if(a[m][0]==c2[3])
{
if(a[m][1]==2)
a[i][j]=2;
}
if(b[m][0]==c2[3])
{
if(b[m][1]==1)
b[i][j]=2;
}
}
}
}
}
else
if((str1[0]=='E')||(str1[0]=='F'))
{
if(i==0)
{
for(j=0;j<3;j++)
{
if(j==0)
{
a[i][j]=b[i][j]=str1[0];
}
if(j==1)
a[i][j]=b[i][j]=2;
if(j==2)
{
a[i][j]=b[i][j]=1;
break;
}
}
}
else
for(m=0;m<10;m++)
{
if(b[m][0]==c1[3])
{
for(k=0;k<10;k++)
{
if(b[k][0]==c2[3])
{
if(b[k][1]==a[i][1])
{
b[k][2]=2;
break;
}
else
{
for(l=0;l<10;l++)
{
if(a[l][0]==c1[3])
break;
if(a[l][0]==0)
{
a[l][0]=str1[0];
a[l][1]=1;
a[l][2]=1;
break;
}
}
}
}
}
}
else
if(b[m][0]==0)
{
for(j=0;j<3;j++)
{
if(j==0)
{
a[i][j]=b[i][j]=str1[0];
}
if(j==1)
{
a[i][j]=2;
b[i][j]=2;
}
if(j==2)
{
for(k=0;k<10;k++)
{
if(b[k][0]==c2[3])
{
if(b[k][1]==a[i][1])
{
a[i][1]=0;
b[i][2]=2;
break;
}
else
{
for(l=0;l<10;l++)
{
if(a[l][0]==c1[3])
{
break;
}
if(a[l][0]==0)
{
a[l][0]=str1[0];
a[l][1]=1;
a[l][2]=1;
break;
}
}
if(a[i][1]==2)
{
a[i][2]=2;
}
}
}
else
{
if(a[i][1]!=2)
{
a[i][2]=1;
}
b[i][2]=1;
}
}
}
}
}
}
}
else
{
MessageBox("无效!");
exit(0);
}
for(j=0;j<3;j++)
{
if(j==0)
{
CString temp1,temp2;
if(a[i][1]!=0)
{
temp1.Format("%c",a[i][j]);
stra += "地址为:" + temp1;
}
if(b[i][1]!=0)
{
temp2.Format("%c",b[i][j]);
strb += "地址为:" + temp2;
}
}
if(j==1)
{
CString temp1,temp2;
if(a[i][1]!=0)
{
temp1.Format("%d",a[i][j]);
stra +=" 接口为:"+temp1;
}
if(b[i][1]!=0)
{
temp2.Format("%d",b[i][j]);
strb +=" 接口为:"+temp2;
}
}
if(j==2)
{
if(a[i][1]!=0)
{
if(a[i][j]==1)
stra +="转发\r\n";
if(a[i][j]==2)
stra +="丢弃\r\n";
}
if(b[i][1]!=0)
{
if(b[i][j]==1)
strb +="转发\r\n";
if(b[i][j]==2)
strb +="丢弃\r\n";
}
}
}
i++;
CString aaa,bbb;
GetDlgItem(IDC_EDIT3)->GetWindowText(aaa);
GetDlgItem(IDC_EDIT4)->GetWindowText(bbb);
aaa += stra;
bbb += strb;
GetDlgItem(IDC_EDIT3)->SetWindowText(aaa);
GetDlgItem(IDC_EDIT4)->SetWindowText(bbb);
}
完成日期:2011年12月31日
展开阅读全文