内蒙古科技大学
计算机网络课程设计报告
指导教师 学生姓名 学 号
班 级
内蒙古科技大学课程设计任务书
课程名称 计算机网络课程设计 时 间 设计题目 交换机工作原理模拟程序 指导教师 一、教学要求 必修内容,要求所 有学习《计算机网络》的同学参与,两个学分 掌握课程设计的目标和详细要求; 掌握实验环境的搭建和使用方法; 完成实际方案的设计 完成设计方案的环境搭建 二、设计资料及参数 Microsoft visual c++,MFC 三、设计要求及成果 交换机工作原理模拟程序 ,通过该程序可实现交换机工 作的简单实现 ,主要是 调用消息,利用MFC做界面 能够实现洪泛、地址学习、地址查找功能, 能够显示交换表内容 独立完成课程设计题目,并进行问题的分析与解决; 要求正确、完整地设计相关文档; 完成设计报告的书写与提交。 四、进度安排 资料查阅与讨论(2天) 案例分析(3天) 系统分析(2天) 方案制定(2天) 网络具体配置与测试(3天) 编写课程设计说明书和验收(2天) 五、评分标准 选题合理、目的明确(10分) 设计方案正确,具有可行性创新性(20分) 设计结果(20分) 态度认真、学习刻苦、遵守纪律(15分) 设计报告的规范化、参考文献充分(10分) 答辩(25分)总分(100分) 2013/1/5 目录
1.设计背景.......................................................................................... 4 2.需求分析.......................................................................................... 5 3. 系统功能 ....................................................................................... 6 4.开发环境.......................................................................................... 7 5.开发背景.......................................................................................... 7 6.软件设计框图 ................................................................................. 9
6.1设计类图 ................................................................................ 9
6.1.1工程类图 ...................................................................... 9 6.1.2资源视图 .................................................................... 10 6.1.3文件视图 .................................................................... 11 6.2界面试图 .............................................................................. 12
界面 ..................................................................................... 12
7.源程序......................................................................................... 17
7.1主界面源程序 ...................................................................... 17 7.2头文件 .................................................................................. 35 8.心得体会........................................................................................ 40 9.参考文献........................................................................................ 40
1.设计背景
在计算机网络互连的时代,网络交互所提供的便利为所有用户所体会,作为一个资源共享的平台而逐步已趋丰富。 交换机在今天的信息时代,已经成为一个很主流的工具,无论普通用户的日常交流与娱乐,还是工作中所必须的功能,都已经是如火如荼。
网络交换机除了能够连接同种类型的网络之外,还可以在不同类型的网络(如以太网和快速以太网)之间起到互连作用。如今许多交换机都能够提供支持快速以太网或FDDI等的高速连接端口,用于连接网络中的其它交换机或者为带宽占用量大的关键服务器提供附加带宽。
一般来说,网络交换机的每个端口都用来连接一个独立的网段,但是有时为了提供更快的接入速度,我们可以把一些重要的网络计算机直接连接到交换机的端口上。这样,网络的关键服务器和重要用户就拥有更快的接入速度,支持更大的信息流量。
在计算机网络系统中,交换概念的提出改进了共享工作模式。而HUB集线器就是一种共享设备,HUB本身不能识别目的地址,当同一局域网内的A主机给B主机传输数据时,数据包在以,HUB为架构的网络上是以广播方式传输的,由每一台终端通过验证数据包头的地址信息来确定是否接收。也就是说,在这种工作方式下,同一时刻网络上只能传输一组数据帧的通讯,如果发生碰撞还得重试。这种方式就是共享共享宽带。通俗的说,普通交换机是不带管理功能的,一根进线,其他接口接到电脑上就可以了。
因此,必须设计交换来连接网络,扩展网络的范围,连接多台PC机,基于这个目的,我设计了一个交换机工作原理的模拟程序,来实现交换机工作的基本原理。
2.需求分析
交换机工作有多个口,连接多台电脑,进行信息交换,通过每台PC机的MAC地址和相应的端口号来进行与其他电脑的连接,进行学习,泛洪等功能。本系统于前者,使用MFC界面实现。
P C-A PC-E
交换机 PC-B PC-D PC-C 图2-1 设计原理图
3.系统功能
交换机的主要功能包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。目前交
换机还具备了一些新的功能,如对VLAN(虚拟局域网)的支持、对链路汇聚的支持,甚至有的还具有防火墙的功能。 学习:以太网交换机了解每一端口相连设备的MAC地址,并将地址同相应的端口映射起来存放在交换机缓存中的MAC地址表中。
转发/过滤:当一个数据帧的目的地址在MAC地址表中有映射时,它被转发到连接目的节点的端口而不是所有端口(如该数据帧为广播/组播帧则转发至所有端口)。
消除回路:当交换机包括一个冗余回路时,以太网交换机通过生成树协议避免回路的产生,同时允许存在后备路径。
交换机除了能够连接同种类型的网络之外,还可以在不同类型的网络(如以太网和快速以太网)之间起到互连作用。如今许多交换机都能够提供支持快速以太网或FDDI等的高速连接端口,用于连接网络中的其它交换机或者为带宽占用量大的关键服务器提供附加带宽。 一般来说,交换机的每个端口都用来连接一个独立的网段,但是有时为了提供更快的接入速度,我们可以把一些重要的网络计算机直接连接到交换机的端口上。这样,网络的关键服务器和重要用户就拥有更快的接入速度,支持更大的信息流量。
客户端连接服务器,将服务器作为中转站,信息始终在客户端与服务器之间传送,若客户端请求与其他客户端通信,需要先将信息传到服务器再有服务器转发给客户端,采用TCP协议实现同信。
4.开发环境
Microsoft visual c++ 6.0 ,MFC
5.开发背景
MFC:微软基础类(Microsoft Foundation Classes),同VCL类似,是一种应用程序框架,随微软Visual C++ 开发工具发布。目前最新版本为10.0(截止2011年3月),并且发布了中文版。该类库提供一组通用的可重用的类库供开发人员使用,大部分类均从CObject 直接或间接派生,只有少部分类例外。
MFC 应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。MFC 提供了MFC AppWizard 自动生成框架。
Windows 应用程序中,MFC 的主包含文件为\"Afxwin.h\"。
此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。
由于它的易用性,初学者常误认为VC++开发必须使用MFC,这种想法是错误的。作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。
MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎。VC++是Windows下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包。MFC作为与VC++血肉相连的部分(注意C++和VC++的区别:C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范;而VC++只是一个编译器,
或者说是一种编译器+源程序编辑器的IDE( IDE的英文全称为“Integrated Development Environment”,即“集成开发环境”。 ),WSPlatForm,这跟Pascal和Delphi的关系一个道理。Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系。Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言)。MFC同BC++集成的VCL一样是一个
非外挂式的软件包类库,只不过MFC类是微软专配。
MFC是Win API与C++的结合。API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB、VC++、Java、Delhpi。编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要。微软如果不提供API,这个世上对Windows编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾。上面说到MFC是微软对API函数的专用
C++封装,这种结合一方面让用户使用微软的专业C++ SDK来进行Windows下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C++ & MFC编制软件时的大量内节,如应用程序实现消息的处理、设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价(这是微软的一向作风),因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的。
最后要明白MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中有好多类不与一个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建、销毁),而是一些在Windows(用MFC编写的程序绝大部分都在Windows中运行)中实现内部处理的类,如数据库的管理类等。学习中最应花费时间的是消息和设备环境,对C++和MF。
MFC是微软封装了的API。什么意思呢?Windows作为一个提供功能强大的应用程序接口编程的操作系统,的确方便了许多程序员,传统的win32开发(直接使用Windows的接口函数API)对于程序员来说非常的困难,因为,API函数实在太多了,而且名称很乱,从零构架一个窗口动辄就是上百行的代码。MFC是面向对象程序设计与Application framework的完美结合,它将传统的API进行了分类封装,并且为你创建了程序的一般框架。
MFC是对WindowsAPI的封装,大大简化了我们的工作;学VC主要就是要学MFC,大约有100多个类,但常用的也就二三十个。应该象背4级单词一样将这些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们;而且,并非每个类的内部的所有函数都要学会,要日积月累。如果真的想成为高手,做个笔记本把自己认为重要的类、函数记下来,随时学习,也是很好的突击方法。
6.软件设计框图
6.1设计类图
6.1.1工程类图
图6.1.1-1 工程视图
6.1.2资源视图
图6.1.2-1 资源视图
6.1.3文件视图
图6.1.3-2 文件视图
6.2界面试图
界面
图1 主界面
输入各PC机IP、源MAC,并在PC-A上输入目的MAC,点击传送,弹出对话框,内容为要传送的目的MAC。
图2 PC-A传送
点击MAC1表,显示记录信息(MAC地址和端口号),完成MAC地址学习。
图3 MAC1表学习
在PC-A上输入目的MAC,点击传送,弹出对话框,内容为要传送的目的MAC。
图4 PC-B传送 查看MAC表,此时MAC表学习,把PC-B的MAC地址和端口号加入MAC1表。
图5 MAC1表学习
更改PC-A的目的MAC地址,传送显示。
图6 PC-A传送
点击MAC1表,由于MAC表中记录了目的MAC地址,所以进行特定端口转发。
图7 MAC1表转发
查看MAC1表,此时不再学习目的MAC地址。
图8 MAC1表记录
填写PC-C的目的MAC,传送显示。
图9 PC-C传送
查看PC-C传送结果。
图10 PC-C传送成功
7.源程序
7.1主界面源程序
// kesheDlg.cpp : implementation file //
#include \"stdafx.h\" #include \"keshe.h\" #include \"kesheDlg.h\"
#ifdef _DEBUG
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About
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); support
//}}AFX_VIRTUAL
// Implementation protected:
//{{AFX_MSG(CAboutDlg) //}}AFX_MSG
DECLARE_MESSAGE_MAP()
// DDX/DDV };
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) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CKesheDlg dialog
CKesheDlg::CKesheDlg(CWnd* pParent /*=NULL*/) : CDialog(CKesheDlg::IDD, pParent) {
//{{AFX_DATA_INIT(CKesheDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
void CKesheDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CKesheDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP }
BEGIN_MESSAGE_MAP(CKesheDlg, CDialog)
//{{AFX_MSG_MAP(CKesheDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(IPN_FIELDCHANGED, IDC_IP1, OnIP1) ON_NOTIFY(IPN_FIELDCHANGED, IDC_IP2, OnIP2) ON_NOTIFY(IPN_FIELDCHANGED, IDC_IP3, OnIP3) ON_NOTIFY(IPN_FIELDCHANGED, IDC_IP4, OnIP4) ON_NOTIFY(IPN_FIELDCHANGED, IDC_IP5, OnIP5) ON_BN_CLICKED(IDC_mac1, Onmac1) ON_BN_CLICKED(IDC_mac2, Onmac2)
ON_EN_CHANGE(IDC_EDITmacA, OnChangeEDITmacA) ON_EN_CHANGE(IDC_EDITmacB, OnChangeEDITmacB) ON_EN_CHANGE(IDC_EDITmacC, OnChangeEDITmacC) ON_EN_CHANGE(IDC_EDITmacD, OnChangeEDITmacD) ON_EN_CHANGE(IDC_EDITmacE, OnChangeEDITmacE) ON_EN_CHANGE(IDC_EDITmacAA, OnChangeEDITmacAA) ON_EN_CHANGE(IDC_EDITmacBB, OnChangeEDITmacBB) ON_EN_CHANGE(IDC_EDITmacCC, OnChangeEDITmacCC) ON_EN_CHANGE(IDC_EDITmacDD, OnChangeEDITmacDD) ON_EN_CHANGE(IDC_EDITmacEE, OnChangeEDITmacEE) ON_BN_CLICKED(IDC_chuansongA, OnchuansongA) ON_BN_CLICKED(IDC_chuansongB, OnchuansongB) ON_BN_CLICKED(IDC_chuansongC, OnchuansongC) ON_BN_CLICKED(IDC_chuansongD, OnchuansongD) ON_BN_CLICKED(IDC_chuansongE, OnchuansongE) ON_BN_CLICKED(IDC_banben, Onbanben) //}}AFX_MSG_MAP END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CKesheDlg message handlers
BOOL CKesheDlg::OnInitDialog() {
CDialog::OnInitDialog();
// Add \"About...\" menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
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);
} }
// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control }
void CKesheDlg::OnSysCommand(UINT nID, LPARAM lParam) {
if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } }
// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.
void CKesheDlg::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();//要禁止这个调用
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_bgmap);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
} }
// The system calls this to obtain the cursor to display while the user drags // the minimized window.
HCURSOR CKesheDlg::OnQueryDragIcon() {
return (HCURSOR) m_hIcon; }
CString IPAddrA = \"\"; CString IPAddrB = \"\"; CString IPAddrC = \"\"; CString IPAddrD = \"\"; CString IPAddrE = \"\";
int a1=0; int a2=0; int a3=0; int a4=0; int a5=0;
char MACA[18]=\"\"; //源mac变量 char MACB[18]=\"\"; char MACC[18]=\"\"; char MACD[18]=\"\"; char MACE[18]=\"\";
char MACA_A[18]=\"\"; //目的mac变量 char MACB_B[18]=\"\"; char MACC_C[18]=\"\"; char MACD_D[18]=\"\"; char MACE_E[18]=\"\";
void CKesheDlg::OnIP1(NMHDR* pNMHDR, LRESULT* pResult) //PC-A的IP {
// TODO: Add your control notification handler code here GetDlgItem(IDC_IP1)->GetWindowText(IPAddrA); // MessageBox(IPAddrA); *pResult = 0;
}
void CKesheDlg::OnChangeEDITmacA() //PC-A的源MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacA,MACA,18); //MACA.GetBuffer(17);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnChangeEDITmacAA() //PC-A的目的MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacAA,MACA_A,18);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnchuansongA() //传送A {
// TODO: Add your control notification handler code here
if(IPAddrA==\"\") //|| IPAddrB==\"\" || IPAddrC==\"\" || IPAddrD==\"\" || IPAddrE==\"\" || MACA==\"\" || MACB==\"\" || MACC==\"\" || MACD==\"\" || MACE==\"\" || MACA_A==\"\" || MACB_B==\"\" || MACC_C==\"\" || MACD_D==\"\" || MACE_E==\"\")
// if(IPAddrA==\"\" || IPAddrB==\"\" || IPAddrC==\"\" || IPAddrD==\"\" || IPAddrE==\"\" || MACA==\"\" || MACB==\"\" || MACC==\"\" || MACD==\"\" || MACE==\"\" || MACA_A==\"\")
{ MessageBox(\"请正确输入信息!\错误\
} else { MessageBox(MACA_A,\"开始传输至目的MAC\ a1=1; }
// MessageBox(\"Please input IP address first!\"); }
void CKesheDlg::OnIP2(NMHDR* pNMHDR, LRESULT* pResult) //PC-B的IP
{
// TODO: Add your control notification handler code here GetDlgItem(IDC_IP1)->GetWindowText(IPAddrB); *pResult = 0; }
void CKesheDlg::OnChangeEDITmacB() //PC-B的源MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacB,MACB,18);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnChangeEDITmacBB() //PC-B的目的MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacBB,MACB_B,18);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnchuansongB() //传送B {
// TODO: Add your control notification handler code here if(IPAddrB == \"\")
//if(IPAddrA==\"\" || IPAddrB==\"\" || IPAddrC==\"\" || IPAddrD==\"\" || IPAddrE==\"\" || MACA==\"\" || MACB==\"\" || MACC==\"\" || MACD==\"\" || MACE==\"\" || MACA_A==\"\")
{ MessageBox(\"请正确输入信息!\错误\
}
else { MessageBox(MACB_B,\"开始传输至目的MAC\ a2=1; } }
void CKesheDlg::OnIP3(NMHDR* pNMHDR, LRESULT* pResult) //PC-C的IP
{
// TODO: Add your control notification handler code here GetDlgItem(IDC_IP1)->GetWindowText(IPAddrC); *pResult = 0; }
void CKesheDlg::OnChangeEDITmacC() //PC-C的源MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacC,MACC,18);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnChangeEDITmacCC() //PC-C的目的MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacCC,MACC_C,18);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnchuansongC() //传送C {
// TODO: Add your control notification handler code here if(IPAddrA==\"\")
//if(IPAddrA==\"\" || IPAddrB==\"\" || IPAddrC==\"\" || IPAddrD==\"\" || IPAddrE==\"\" || MACA==\"\" || MACB==\"\" || MACC==\"\" || MACD==\"\" || MACE==\"\" || MACA_A==\"\")
{ MessageBox(\"请正确输入信息!\错误\
} else { MessageBox(MACC_C,\"开始传输至目的MAC\ a3=1; } }
void CKesheDlg::OnIP4(NMHDR* pNMHDR, LRESULT* pResult) //PC-D的IP
{
// TODO: Add your control notification handler code here GetDlgItem(IDC_IP1)->GetWindowText(IPAddrD); *pResult = 0; }
void CKesheDlg::OnChangeEDITmacD() //PC-D的源MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacD,MACD,18);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnChangeEDITmacDD() //PC-D的目的MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacDD,MACD_D,18);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnchuansongD() //传送D {
// TODO: Add your control notification handler code here
if(IPAddrA==\"\" || IPAddrB==\"\" || IPAddrC==\"\" || IPAddrD==\"\" || IPAddrE==\"\" || MACA==\"\" || MACB==\"\" || MACC==\"\" || MACD==\"\" || MACE==\"\" || MACA_A==\"\")
{ MessageBox(\"请正确输入信息!\错误\
} else { MessageBox(MACD_D,\"开始传输至目的MAC\ a4=1; } }
void CKesheDlg::OnIP5(NMHDR* pNMHDR, LRESULT* pResult) //PC-E的IP
{
// TODO: Add your control notification handler code here GetDlgItem(IDC_IP1)->GetWindowText(IPAddrE); *pResult = 0; }
void CKesheDlg::OnChangeEDITmacE() //PC-E的源MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacE,MACE,18);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnChangeEDITmacEE() //PC-E的目的MAC {
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItemText(IDC_EDITmacEE,MACE_E,18);
// TODO: Add your control notification handler code here }
void CKesheDlg::OnchuansongE() //传送E {
// TODO: Add your control notification handler code here
if(IPAddrA==\"\" || IPAddrB==\"\" || IPAddrC==\"\" || IPAddrD==\"\" || IPAddrE==\"\" || MACA==\"\" || MACB==\"\" || MACC==\"\" || MACD==\"\" || MACE==\"\" || MACA_A==\"\")
{ MessageBox(\"请正确输入信息!\错误\
} else { MessageBox(MACE_E,\"开始传输至目的MAC\ a5=1; } }
int count=0; //MAC表记录条数 char
str[20][24]={\"a\a\加上端口
//CString s1,s2,s3,s4,s5,s6,s7,s8,s9,s10; CString s[20]={\"\CString ss=\"\";
char s1[5]={\" 1\char s2[5]={\" 2\char s3[5]={\" 3\ char
macadder[3][24]={\"12-23-34-45-56-67\
int search(char MAC[]) //在MAC表中查找目的mac是否存在 {
for(int j=0; j int searchport(char A[]) { for(int j=0; j<3; j++) { if(strcmp(A,macadder[j])==0) { return j+1; } } } void CKesheDlg::Onmac1() //MAC1表 { // TODO: Add your control notification handler code here if(count==1) ss=s[count-1]; else if(count>=2) { for(int j=0; j if(ret==IDOK) { char AA[24]=\"\"; strcpy(AA,MACA); //用AA代替源MAC,避免影响下边源MAC的操作 strcat(AA,s1); int tt=search(AA); if(tt==0) { strcpy(str[count],MACA); strcat(str[count],s1); count++; ss.Format(\"%s\\n%s\ //添加进新的MAC地址 } MessageBox(ss); //查看mac表 } else { MessageBox(\"转发成功!\成功\//查看是否发送过去 } } else //没有查找到目的mac地址,进行泛洪,并把源mac地址加入到mac表中 { char AA[24]=\"\"; strcpy(AA,MACA); //用AA代替源MAC,避免影响下边源MAC的操作 strcat(AA,s1); int tt=search(AA); if(tt==0) { strcpy(str[count],MACA); strcat(str[count],s1); s[count]=str[count]; count++; if(count==1) ss=s[count-1]; else ss.Format(\"%s\\n%s\ //添加进新的MAC地址 } MessageBox(ss); ss=\"\"; //重置 } a1=0; //重置0 } else if(a2 == 1) //端口1的PC-B { char B[24]; strcpy(B,MACB_B); int p=searchport(B); //查找那个端口与目的端口匹配 if(p==1) strcat(B,s1); //封装端口号 else if(p==2) strcat(B,s2); //封装端口号 else if(p==3) strcat(B,s3); //封装端口号 int t=search(B); //查询MAC表 if(t==1) //查到目的MAC地址在MAC表中 { int ret=MessageBox(\"查看MAC表(OK),查看是否发送(CANCLE)。\ if(ret==IDOK) { char BB[24]=\"\"; strcpy(BB,MACB); //用BB代替源MAC,避免影响下边源MAC的操作 strcat(BB,s2); int tt=search(BB); if(tt==0) { strcpy(str[count],MACB); strcat(str[count],s2); count++; ss.Format(\"%s\\n%s\ //添加进新的MAC地址 } MessageBox(ss); //查看mac表 } else { MessageBox(\"转发成功!\成功\//查看是否发送过去 } } else //没有查找到目的mac地址,进行泛洪,并把源mac地址加入到mac表中 { char BB[24]; strcpy(BB,MACB); //用BB代替源MAC,避免影响下边源MAC的操作 strcat(BB,s2); int tt=search(BB); if(tt==0) { strcpy(str[count],MACB); strcat(str[count],s2); s[count]=str[count]; count++; if(count==1) ss=str[count-1]; else ss.Format(\"%s\\n%s\ //添加进新的MAC地址 } MessageBox(ss); ss=\"\"; //重置 } a2=0; //重置0 } else if(a3 == 1) //端口1的PC-C { char C[24]; strcpy(C,MACC_C); int p=searchport(C); //查找那个端口与目的端口匹配 if(p==1) strcat(C,s1); //封装端口号 else if(p==2) strcat(C,s2); //封装端口号 else if(p==3) strcat(C,s3); //封装端口号 int t=search(C); //查询MAC表 if(t==1) //查到目的MAC地址在MAC表中 { int ret=MessageBox(\"查看MAC表(OK),查看是否发送(CANCLE)。\ if(ret==IDOK) { char CC[24]=\"\"; strcpy(CC,MACC); //用CC代替源MAC,避免影响下边源 MAC的操作 strcat(CC,s3); int tt=search(CC); if(tt==0) { strcpy(str[count],MACC); strcat(str[count],s3); count++; ss.Format(\"%s\\n%s\ //添加进新的MAC地址 } MessageBox(ss); //查看mac表 } else { MessageBox(\"转发成功!\成功\//查看是否发送过去 } } else //没有查找到目的mac地址,进行泛洪,并把源mac地址加入到mac表中 { char CC[24]; strcpy(CC,MACC); //用CC代替源MAC,避免影响下边源MAC的操作 strcat(CC,s3); int tt=search(CC); if(tt==0) { strcpy(str[count],MACC); strcat(str[count],s3); s[count]=str[count]; count++; if(count==1) ss=str[count-1]; else ss.Format(\"%s\\n%s\ //添加进新的MAC地址 } MessageBox(ss); ss=\"\"; //重置 } a3=0; //重置0 } else if(a4 == 1) //端口2的PC-D { // } else if(a5 == 1) //端口2的PC-E { // } else { MessageBox(\"没有记录!\"); } /* CString str1 = \"\"; for (int i=0; i<20; ++i) { CString str2 = \"\"; str2.Format(\"%d, \ str1 += str2; } MessageBox(str1 & Chr(13) & Chr(10)); CString s1, s2, s3; s1=\"good\"; s2=\"morning\"; s3.format(\"%s\\n%s\ AfxMessageBox(s3); if(a1 = 1) MessageBox(\"1\");*/ // MessageBox(\"PC-B 2\"); } void CKesheDlg::Onmac2() //MAC2表 { // TODO: Add your control notification handler code here } void CKesheDlg::Onbanben() { // TODO: Add your control notification handler code here MessageBox(\"版本:第一版\\n时间:2013年1月1日\\n作者:高源成\版本\"); } 7.2头文件 // keshe.h : main header file for the KESHE application // #if !defined(AFX_KESHE_H__FB5E8F28_3C22_4010_8BAD_48492BB2E6C7__INCLUDED_) #define AFX_KESHE_H__FB5E8F28_3C22_4010_8BAD_48492BB2E6C7__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef __AFXWIN_H__ #error include 'stdafx.h' before including this file for PCH #endif #include \"resource.h\" // main symbols ///////////////////////////////////////////////////////////////////////////// // CKesheApp: // See keshe.cpp for the implementation of this class // class CKesheApp : public CWinApp { public: CKesheApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CKesheApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CKesheApp) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_KESHE_H__FB5E8F28_3C22_4010_8BAD_48492BB2E6C7__INCLUDED_) // kesheDlg.h : header file // #if !defined(AFX_KESHEDLG_H__95DB63E9_C8A1_4B00_A64D_77DF76B8BDE8__INCLUDED_) #define AFX_KESHEDLG_H__95DB63E9_C8A1_4B00_A64D_77DF76B8BDE8__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 ///////////////////////////////////////////////////////////////////////////// // CKesheDlg dialog class CKesheDlg : public CDialog { // Construction public: CKesheDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CKesheDlg) enum { IDD = IDD_KESHE_DIALOG }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CKesheDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CKesheDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnIP1(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnIP2(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnIP3(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnIP4(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnIP5(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void Onmac1(); afx_msg void Onmac2(); afx_msg void OnChangeEDITmacA(); afx_msg void OnChangeEDITmacB(); afx_msg void OnChangeEDITmacC(); afx_msg void OnChangeEDITmacD(); afx_msg void OnChangeEDITmacE(); afx_msg void OnChangeEDITmacAA(); afx_msg void OnChangeEDITmacBB(); afx_msg void OnChangeEDITmacCC(); afx_msg void OnChangeEDITmacDD(); afx_msg void OnChangeEDITmacEE(); afx_msg void OnchuansongA(); afx_msg void OnchuansongB(); afx_msg void OnchuansongC(); afx_msg void OnchuansongD(); afx_msg void OnchuansongE(); afx_msg void Onbanben(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_KESHEDLG_H__95DB63E9_C8A1_4B00_A64D_77DF76B8BDE8__INCLUDED_) //{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by keshe.rc // #define IDM_ABOUTBOX #define IDD_ABOUTBOX #define IDS_ABOUTBOX #define IDD_KESHE_DIALOG #define IDR_MAINFRAME #define IDB_bgmap #define IDB_jiantoudown #define IDB_jiantouup #define IDB_jiantouhen #define IDB_jiaohuanji #define IDB_computerA #define IDB_computerB #define IDB_computerC #define IDB_computerD #define IDB_computerE #define IDC_IP4 #define IDC_IP2 #define IDC_IP1 #define IDC_IP3 #define IDC_IP5 #define IDC_MONTHCALENDAR1 #define IDC_mac1 #define IDC_mac2 #define IDC_jiantouA #define IDC_jiantouB #define IDC_jiantouC #define IDC_jiantouD #define IDC_jiantouE #define IDC_EDITmacB #define IDC_EDITmacA #define IDC_EDITmacC #define IDC_EDITmacE #define IDC_EDITmacD 0x0010 100 101 102 128 129 132 138 139 143 144 145 146 147 1000 1001 1002 1003 1004 1008 1009 1010 1013 1014 1015 1016 1017 1019 1020 1021 1022 1023 142 #define IDC_EDITmacAA 1024 #define IDC_EDITmacCC 1025 #define IDC_EDITmacEE 1026 #define IDC_EDITmacDD 1027 #define IDC_EDITmacBB 1028 #define IDC_banben 1029 #define IDC_chuansongA 1031 #define IDC_chuansongB 1032 #define IDC_chuansongD 1033 #define IDC_chuansongE 1034 #define IDC_chuansongC 1035 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 148 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1032 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__6AB24B36_DBD5_4140_A7EB_84AC8642133F__INCLUDED_) #define AFX_STDAFX_H__6AB24B36_DBD5_4140_A7EB_84AC8642133F__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #include #include #ifndef _AFX_NO_AFXCMN_SUPPORT #include #endif // _AFX_NO_AFXCMN_SUPPORT //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__6AB24B36_DBD5_4140_A7EB_84AC8642133F__INCLUDED_) 8.心得体会 通过此次课程设计,我学到了很多。我知道了如何通过编程实现简单的计算机间通信。 另一方面,我懂得了理论和实践是有很大的差距。只有理论和实践相结合,才能学到真知识。同时我深感压力,我无论从理论还是实践,都还达不到要求,通过这次课程设计,我深刻体会到我和别人的差距,还有很多地方需要加强。在以后的学习生涯里要努力学习理论知识,多动手实践,才能有更大的进步。 9.参考文献 , Msdn查询器 等 因篇幅问题不能全部显示,请点此查看更多更全内容