《计算机网络与通信》课程设计-获取主机名和IP地址_第1页
《计算机网络与通信》课程设计-获取主机名和IP地址_第2页
《计算机网络与通信》课程设计-获取主机名和IP地址_第3页
《计算机网络与通信》课程设计-获取主机名和IP地址_第4页
《计算机网络与通信》课程设计-获取主机名和IP地址_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、武汉理工大学计算机网络与通信课程设计说明书目录TOC o 1-3 t h z u HYPERLINK l _Toc13305 1 绪言 1 绪言Microsoft Visual C+是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和HYPERLINK /view/119481.htm界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持HYPERLINK /view/4556838.htm数据库接口、OLE2,HYPERLINK /view/339343.htmWinSo

2、ck网络、3D控制界面。它以拥有“语法高亮”,IntelliSense(自动完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著。在网络编程中,像获取主机名和IP地址这样的基本应用是必不可少的,这些基本的应用通过适当改变可以很容易地应用到网络软件中。因此,获取主机名和IP地址是用现实意义的。2方案的论证及选择方案一:用Windows API进行设计。Windows A

3、PI可以很容易获取主机名和IP地址,但是在窗口设计是却显得比较繁琐。方案二:用MFC进行设计。用MFC设计可以更容易的设计显示界面,在获取主机名和IP地址方面也比不复杂。综上,选择方案二。3 重要结构和函数3.1 函数gethostname函数原型为:int gethostname(char *name,int namelen);其中,参数name是一个指向将要存放主机名的缓冲区的指针,namelen用于指定缓冲区的长度。该函数把HYPERLINK /view/544310.htm本地主机名存放入由name参数指定的缓冲区中。返回的HYPERLINK /view/1617349.htm主机名是

4、一个以HYPERLINK /view/329484.htmNULL结束的HYPERLINK /view/56072.htm字符串。HYPERLINK /view/1617349.htm主机名的形式取决于HYPERLINK /view/4944609.htmWindows Sockets实现它可能是一个简单的主机名,或者是一个域名。然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。如果没有错误发生,gethostname()返回0。否则它返回SOCKET_ERROR。3.2 函数gethostbyname函数原型为: struct h

5、ostent* gethostbyname(const char* addr);其中,addr为指向主机名的指针,它一般有函数gethostname返回。该函数返回对应于给定主机名的包含主机名字和地址信息的hostent结构HYPERLINK /view/159417.htm指针,该结构的格式如下:structhostent char*h_name; char*h_aliases; inth_addrtype; inth_length; char*h_addr_list; #define h_addr h_addr_list0;其中,h_name是地址的正式名称;h_aliases是空字节-地

6、址的预备名称的HYPERLINK /view/159417.htm指针;h_addrtype地址类型,通常是HYPERLINK /view/3634059.htmAF_INET;h_length地址的比特长度;h_addr_list是零字节-主机网络地址HYPERLINK /view/159417.htm指针;网络HYPERLINK /view/567601.htm字节顺序;h_addr - h_addr_list中的第一地址。需要注意的是gethostbyname()函数属于WinSock API库,而在使用WinSock API之前,必须调用WSA-Startup函数,只有该函数成功返回(

7、表示HYPERLINK /view/330120.htm应用程序与WinSock库成功地建立起连接),应用程序才可以调用其他Windows Sockets DLL中的函数。当程序将要结束时,又必须调用WSACleanup 函数进行清理工作,以便释放其占用的资源。WSACleanup 函数用来结束Windows Sockets DLL的使用。3.3 函数inet_ntoa函数原型为:char FAR * inet_ntoa( struct in_addr HYPERLINK /view/42613.htmin);该函数将一个IP转换成一个互联网标准点分格式的字符串,in为一个表示Internet

8、HYPERLINK /view/547482.htm主机地址的结构。如果正确,返回一个字符HYPERLINK /view/159417.htm指针,指向一块存储着点分格式IP地址的静态缓冲区(同一线程内共享此内存);错误,返回NULL。3.4 函数TextOut函数原型为:BOOL TextOut(HDC hdc,int nXStart,int nYStart, LPCTSTR lpString,int cbString );Hdc:设备环境的句柄nXStart: 指定用于字符串对齐的基准点的逻辑X坐标。nYStart:指定用于字符串对齐的基准点的逻辑Y坐标。lpString:指向将被绘制字符

9、串的HYPERLINK /view/159417.htm指针。此字符串不必为以0结束的,因为cbString中指定了字符串的长度。cbString:指定了字符串的长度。该函数用当前选择的HYPERLINK /view/285104.htm字体、背景颜色和正文颜色将一个字符串写到指定位置。如果HYPERLINK /view/2369016.htm函数调用成功,返回值为非零值。如果HYPERLINK /view/2369016.htm函数调用失败,返回值为0。3.5 函数memcpy函数原型为:void *memcpy(void *dest, const void *src, size_t n);

10、该函数从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。3.6 WSAData结构结构原型为:structWSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYSSTATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char *lpVendorInfo;HYPERLINK /link?url=Q0koNqZOymz0

11、mFfNGw4MjRxGjGji8-hyL57v62EUIP7Xexue0Z5SNrARBfLw5kctaH6objWjCCaHAkbuXKvX3a#wVersion:Windows Sockets DLL期望调用者使用的Windows Sockets规范的版本。 高位HYPERLINK /view/60408.htm字节存储副版本号, 低位字节存储主版本号,可以用WORD MAKEWORD(BYTE,BYTE ) 返回这个值,例如:MAKEWORD(1,1)wHighVersion:这个DLL能够支持的Windows Sockets规范的最高版本。通常它与wVersion相同。szDescr

12、iption:以null结尾的ASCII字符串,Windows Sockets DLL将对Windows Sockets实现的描述拷贝到这个字符串中,包括制造商标识。文本(最多可以有256个字符)可以包含任何字符,但是要注意不能包含HYPERLINK /view/1112575.htm控制字符和HYPERLINK /view/2194593.htm格式字符,应用程序对其最可能的使用方式是把它(可能被截断)显示在在状态信息中。szSystemStatus:以null结尾的ASCII字符串,Windows Sockets DLL把有关的状态或配置信息拷贝到该字符串中。Windows Sockets

13、 DLL应当仅在这些信息对用户或支持人员有用时才使用它们,它不应被作为szDescription域的扩展。iMaxSockets:单个进程能够打开的socket的最大数目。Windows Sockets的实现能提供一个全局的socket池,可以为任何进程分配;或者它也可以为socket分配属于进程的资源。这个数字能够很好地反映Windows Sockets DLL或网络软件的配置方式。应用程序的编写者可以通过这个数字来粗略地指明Windows Sockets的实现方式对应用程序是否有用。例如,X Windows服务器在第一次启动的时候可能会检查iMaxSockets的值:如果这个值小于8,应用

14、程序将显示一条HYPERLINK /view/627766.htm错误信息,指示用户重新配置网络软件(这是一种可能要使用szSystemStatusHYPERLINK /view/300107.htm文本的场合)。显然无法保证某个应用程序能够真正分配iMaxSockets个socket,因为可能有其它WindowsSockets应用程序正在使用。iMaxUdpDg:Windows Sockets应用程序能够发送或接收的最大的用户数据包协议(UDP)的数据包大小,以HYPERLINK /view/60408.htm字节为单位。如果实现方式没有限制,那么iMaxUdpDg为零。在Berkeley

15、sockets的许多实现中,对于UDP数据包有个固有的限制(在必要时被分解),大小为8192字节。Windows Sockets的实现可以对碎片重组缓冲区的分配作出限制。对于适合的WindowsSockets 实现,iMaxUdpDg的最小值为512。注意不管iMaxUdpDg的值是什么,都不推荐你发回一个比网络的最大传送单元(MTU)还大的HYPERLINK /view/567597.htm广播数据包。(Windows Sockets API 没有提供发现MTU的机制,但是它不会小于512个字节)。WinSock2.0版中已被废弃。lpVendorInfo:指向销售商的数据结构的HYPERL

16、INK /view/159417.htm指针。这个结构的定义(如果有)超出了HYPERLINK /view/567569.htmWindowsSockets规范的范围。WinSock2.0版中已被废弃。4 设计过程4.1 新建对话框启动Visual C+ 6.0,新建对话框应用程序,工程名为sanjin,对话框标题改为“主机名和IP地址”。4.2 添加控件删除掉对话框模板上的控件,添加新控件,如下表所示。表1 控件及其属性一览表控件ID号标题属性BUTTONIDC_BUTTON1擦除默认BUTTONIDC_BUTTON2退出默认Static Text默认Client edgeCheck Box

17、IDC_CHECK1运行默认添加完控件后的对话框模板如下图所示。图1 添加完控件后的对话框模板图4.3 添加成员变量打开ClassWizard对话框的Member Variables标签,为下列控件添加成员变量。如下表所示。表2 控件及变量属性控件ID变量名变量类型数值范围IDC_CHECK1m_Chk1BOOL4.4 为控件添加映射消息选择MFC ClassWizard对话框的Message Maps标签,为以下控件添加映射消息。如下表所示。表3 控件映射消息Class nameObject idsMessagesMember functionsCSanjinDlgIDC_BUTTON1BN

18、_CLICKEDOn_Button1CSanjinDlgIDC_BUTTON2BN_CLICKEDOn_Button2CSanjinDlgIDC_CHECK1BN_CLICKEDOn_Check14.5 定义函数在sanjinDlg.h中定义一个Draw函数。public:void Draw();4.6 添加代码在sanjinDlg.cpp文件中添加代码,实现功能。添加程序代码如下:void CSanjinDlg:OnButton1() / TODO: Add your control notification handler code hereInvalidate();void CSanji

19、nDlg:OnButton2() / TODO: Add your control notification handler code hereOnOK();void CSanjinDlg:OnCheck1() / TODO: Add your control notification handler code herem_Chk1=!m_Chk1;/初始化Draw();void CSanjinDlg:Draw()CClientDC dc(this);int height;CFont font;height=75;if(m_Chk1)font.CreateFont(20,10,0,0,FW_N

20、ORMAL,false,false,false,GB2312_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,宋体);elsefont.CreateFont(20,10,0,0,FW_NORMAL,false,false,false,GB2312_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,楷体_GB2312);CRect rect(15,25,336,276);dc.FillSoli

21、dRect(&rect,RGB(215,210,206);dc.SelectObject(&font);dc.SetBkMode(TRANSPARENT);/初始化:如果不初始化,以下代码将无法执行WSAData data;if(WSAStartup(MAKEWORD(1,1),&data)!=0)dc.TextOut(25,45,初始化错误,无法获取主机信息.); char host255;/获取主机名if(gethostname(host,sizeof(host)=SOCKET_ERROR)dc.TextOut(25,45,无法获取主机名);elsedc.TextOut(25,45,本机主

22、机名为:);dc.TextOut(75,75,host);/获取计算机IP:gethostbyname也需要初始化(上面已初始化)struct hostent *p=gethostbyname(host);if(p=0)dc.TextOut(25,45,无法获取计算机主机名及IP.);else /本机IP:利用循环,输出本机所有IP for(int i=0;p-h_addr_listi!=0;i+) struct in_addr in; memcpy(&in,p-h_addr_listi,sizeof(struct in_addr); dc.TextOut(25,height+(i+1)*he

23、ight/3,块网卡IP为:);/除以3只能正常 /显示两个IP,要想显示多个IP地址还需添加一个计算IP地址个数的循环dc.TextOut(75,height+(i+1)*height*2/3,inet_ntoa(in); WSACleanup();程序说明:函数OnButton1()调用Invalidate()实现擦除功能,函数OnButton1()调用OnOK()实现退出功能,OnCheck1()作为触发主要功能程序Draw()运行的函数。Draw()函数定义了一个CClientDC类的对象dc,和一个Cfont类的对象font。定义对象dc来实现将所获得的主机名和IP地址显示在对话框上

24、,定义对象font来设置字体样式。4.7 设计icon并运行程序在Resource View中擦除原icon,为自己设计一个Icon。然后将程序编译并链接,运行程序,查看运行结果。5 程序运行结果及分析程序运行的最终效果如图所示。图2 最终效果图点击运行后,调用Draw()函数,Draw()函数调用gethostname()和getbyhostname()得到本地主机名和IP地址,并调用TextOut()显示在窗口的指定位置。6 心得体会本次课设实现了获取本地主机名和IP地址的功能,并用基本对话框显示所获得的结果,可以说是成功的。有一个小缺点是要使程序显示出主机名和IP地址是通过点击复选框,这

25、不符合通常我们都是点击按钮的习惯。但总体上我以为是成功的。为了做这个课设,我确实花了一番心思。虽说有C语言的基础,但实际上从我拿到题目查资料到最终做出来,我有一种从零学起的感觉。这主要是因为VC+内容太多,一时之间难以接受这么多。当然,这也从另一方面反映了VC+功能之强大,对这一点还从我查资料的过程中有所体会。这次课设最大的收获可以说是更进一步了解了什么是学习,最大的进步是学会了如何面对问题。以前遇到问题,我通常都会变得心浮气躁,甚至会想“罢工”,但这一次却没有。这一次的课设过程还是我的一个新认识的落实。说实话,我是这学期才明白“钻研”是什么意思,我觉得所谓“钻研”其实和“死磕”很有点像,只不

26、过“钻研”需要心平气和,因为不心平气和就不容易长久。我觉得我这次的课设就有点在和VC+“死磕”的感觉。参考文献1管皓,高永丽别样诠释一个Visual C+老鸟10年学习与开发心得北京:北京航空航天大学出版社,2012.112梁海英Visual C+程序设计北京:清华大学出版社,20133唐文超Visual C+网络编程北京:清华大学出版社,20134赵永发,刘莉莉Visual C+入门经典北京:机械工业出版社,20135张水波,董志鹏Visual C+网络大讲堂北京:清华大学出版社,2013附录1 sanjinDlg.cpp程序/ sanjinDlg.cpp : implementation

27、file/#include stdafx.h#include sanjin.h#include sanjinDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CSanjinDlg dialogCSanjinDlg:CSanjinDlg(CWnd* pParent /*=NULL*/): CDialog(CSanjinDlg:IDD, pParent)/AFX_DATA_INIT(CSanjinDlg)m_Chk1 = FALSE;/AFX_DATA_INIT

28、/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CSanjinDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CSanjinDlg)DDX_Check(pDX, IDC_CHECK1, m_Chk1);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CSanjinDlg, CD

29、ialog)/AFX_MSG_MAP(CSanjinDlg)ON_WM_PAINT()ON_WM_QUERYDRAGICON()/添加消息响应函数,为每个消息处理函数加入一个入口ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_CHECK1, OnCheck1)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CSanjinDlg message handlersBOOL CSanjinDlg:OnInitDialog()CDialog:OnInit

30、Dialog();/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization herereturn TRUE; / return TRUE unless you set the focus to a

31、control/ 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 CSanjinDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendM

32、essage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint 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 icondc

33、.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CSanjinDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CSanjinDlg:OnButton1() / TODO: Add your control notification handler code hereInvalidate

34、();/设置无效void CSanjinDlg:OnButton2() / TODO: Add your control notification handler code hereOnOK();/退出void CSanjinDlg:OnCheck1() / TODO: Add your control notification handler code herem_Chk1=!m_Chk1;/初始化Draw();/调用函数void CSanjinDlg:Draw()CClientDC dc(this);/定义对象dc以调用CClientDC中的成员函数int height;CFont fon

35、t;/定义对象font以设置字体height=75;if(m_Chk1)font.CreateFont(20,10,0,0,FW_NORMAL,false,false,false,GB2312_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,宋体);elsefont.CreateFont(20,10,0,0,FW_NORMAL,false,false,false,GB2312_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUAL

36、ITY,DEFAULT_PITCH,楷体_GB2312);CRect rect(15,25,336,276);/画矩形框dc.FillSolidRect(&rect,RGB(215,210,206);/设置矩形框的颜色dc.SelectObject(&font);dc.SetBkMode(TRANSPARENT);/初始化:如果不初始化,以下代码将无法执行WSAData data;if(WSAStartup(MAKEWORD(1,1),&data)!=0)/在使用WinSock API之前,必须调用WSA-Startup函数,/只有该函数成功返回(表示应用程序与WinSock库成功地建立起连接

37、),/应用程序才可以调用其他Windows Sockets DLL中的函数。当程序将要结束时,/又必须调用WSACleanup 函数进行清理工作,以便释放其占用的资源。dc.TextOut(25,45,初始化错误,无法获取主机信息.);/调用TextOut函数 char host255;/获取主机名if(gethostname(host,sizeof(host)=SOCKET_ERROR)/把本地主机名存放入由host参数指定的缓冲区中dc.TextOut(25,45,无法获取主机名);elsedc.TextOut(25,45,本机主机名为:);dc.TextOut(75,75,host);/

38、获取计算机IP:gethostbyname也需要初始化(上面已初始化)struct hostent *p=gethostbyname(host);/返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针if(p=0)dc.TextOut(25,45,无法获取计算机主机名及IP.);else /本机IP:利用循环,输出本机所有IP for(int i=0;p-h_addr_listi!=0;i+) struct in_addr in; memcpy(&in,p-h_addr_listi,sizeof(struct in_addr);/从源p-h_addr_listi所指的内存地址的起始位置/开始拷贝sizeof(struct in_addr)个字节到目标dest所指的内存地址的起始位置中 dc.TextOut(25,height+(i+1)*height/3,IP地

温馨提示

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

评论

0/150

提交评论