《计算机网络与通信》课程设计获取主机名和IP地址目录
《计算机网络与通信》课程设计获取主机名和IP地址
1 绪言
M crosft isu l C+是M r oft公司推出的开发W n32环境程序面向对象的可视化集成编程系统它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2WinSock网络、 D控制界面。它以拥有“语法高亮” Int l l iSen e(自动完成功能 以及高级除错功能而著称比如 它允许用户进行远程调试单步执行等。还有允许用户在调试期间重新编译被修改的代码而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著
在网络编程中,像获取主机名和I 地址这样的基本应用是必不可少的,这些基本的应用通过适当改变可以很容易地应用到网络软件中因此,获取主机名和
I 地址是用现实意义的。
方案的论证及选择
方案一用W dosA I进行设计。Wind w PI可以很容易获取主机名和IP地址但是在窗口设计是却显得比较繁琐
方案二用FC进行设计用MFC设计可以更容易的设计显示界面在获取主机名和IP地址方面也比不复杂。
综上选择方案二
重要结构和函数
3 1函数geth stname
函数原型为int gethostnae( ar nam int ael n
其中参数nae是一个指向将要存放主机名的缓冲区的指针,namele用于指定缓冲区的长度。该函数把本地主机名存放入由nae参数指定的缓冲区中。返回的主机名是一个以ULL结束的字符串。主机名的形式取决于W dows Sck 实现它可能是一个简单的主机名,或者是一个域名然而,返回的名字必定可以在 t ost yname(和WSAA yncG tH stByName( 中使用。如果没有错误发生 ge hos ae 返回0否则它返回SOCK T_ERRO
2 函数get os byna
函数原型为
truct hos ent g tho byna s chara dr ;
其中 a dr为指向主机名的指针 它一般有函数 t o tn m返回该函数返回对应于给定主机名的包含主机名字和地址信息的h stent结构指针,该结构的格式如下:str c hos t {char _namcha *hal asesint add ty e;i th_len thch _ ddr_l is
《计算机网络与通信》课程设计获取主机名和IP地址
#d fi e h_ d had _ s 0]
}
其中,h_ ame是地址的正式名称 h_ ia 是空字节-地址的预备名称的指针 h_ad rtyp 地址类型通常是AF N ET;h_ ength地址的比特长度 a drl ist是零字节—主机网络地址指针 网络字节顺序h_ad r—h_add ist中的第一地址
需要注意的是 th t y a 函数属于W ockAPI库而在使用WinSockA 之前必须调用SA—S artu 函数只有该函数成功返回 表示应用程序与WinSock库成功地建立起连接 应用程序才可以调用其他Windows Sockets DLL中的函数。 当程序将要结束时又必须调用WSAClea up函数进行清理工作 以便释放其占用的资源SC anup 函数用来结束W o o e DL 的使用。
3。 3函数 netn oa
函数原型为:
ha FR* e _ o s u _add i ;
该函数将一个 P转换成一个互联网标准点分格式的字符串 in为一个表示I net主机地址的结构如果正确,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区(同一线程内共享此内存)错误返回
L。
4函数 ex ut
函数原型为
BOOLT O t(
HD c,i n ta t,i t nY tar
LPCTS lpSt i g
nt bSt i g
Hd 设备环境的句柄
XSt r :指定用于字符串对齐的基准点的逻辑坐标。nY t 指定用于字符串对齐的基准点的逻辑坐标。
pS ring:指向将被绘制字符串的指针。此字符串不必为以0结束的,因为cbStr ng中指定了字符串的长度cbSt ing指定了字符串的长度
该函数用当前选择的字体、背景颜色和正文颜色将一个字符串写到指定位置如果函数调用成功,返回值为非零值如果函数调用失败,返回值为0。 。 5函数mecp
函数原型为:voi mcp o d e t const voi s c,size_t
该函数从源sr 所指的内存地址的起始位置开始拷贝n个字节到目标de t所指的内存地址的起始位置中。
《计算机网络与通信》课程设计获取主机名和IP地址
3。 WSADa a结构
结构原型为s ru tWADat
WORD wersi n;
WOD wi hVersi nchar zD i t o [S S P ON N ];
h r szSystem ta u SASYSS ATU _LEN+1 ;un gned hort iMa Sockets;
nsig ed short axUdpDg;char lpVen or fo
wV r o W ndows k t D LL期望调用者使用的indow ke s规范的版本高位字节存储副版本号 低位字节存储主版本号可以用WO MA EO R D YTE BYT E 返回这个值,例如:A E(1
HighVersi n这个DLL能够支持的W n ows So ets规范的最高版本。通常它与we rs i n相同。szDescription:以n l结尾的SI 字符串,Window S ketsLL将对Win os So e s实现的描述拷贝到这个字符串中,包括制造商标识文本最多可以有2 个字符)可以包含任何字符但是要注意不能包含控制字符和格式字符,应用程序对其最可能的使用方式是把它(可能被截断显示在在状态信息中
Sy tem tatus 以nul l结尾的ASCI 字符串,Wi dowsSockets DLL把有关的状态或配置信息拷贝到该字符串中。W ndows Soc ts D L应当仅在这些信息对用户或支持人员有用时才使用它们 它不应被作为szescript on域的扩展。i xSo e s单个进程能够打开的 oc 的最大数目。Win ws So e 的实现能提供一个全局的s ket池可以为任何进程分配;或者它也可以为 ck t分配属于进程的资源。这个数字能够很好地反映Wi dos S ke D L或网络软件的配置方式应用程序的编写者可以通过这个数字来粗略地指明W nd ws ket 的实现方式对应用程序是否有用。例如 i dows服务器在第一次启动的时候可能会检查iMaxSockets的值如果这个值小于8应用程序将显示一条错误信息指示用户重新配置网络软件这是一种可能要使用 ystemStatus文本的场合 。显然无法保证某个应用程序能够真正分配 MaxSoc e s个soc t,因为可能有其它W d wsSoc e s应用程序正在使用i Ud DgWin Sc t 应用程序能够发送或接收的最大的用户数据包协议UDP 的数据包大小 以字节为单位。如果实现方式没有限制那么iMaxU Dg为零。在 erke ey sock ts的许多实现中对于数据包有个固有的限制在必要时被分解 大小为 92字节WindosSock 的实现可以对碎片重组缓冲区的分配作出限制。对于适合的Win ows o k t 实现, Maxd 的最小值为512注意不管 MaxUdpDg的值是什么都不推荐你发回一个比网络的最大传送单
《计算机网络与通信》课程设计获取主机名和IP地址
元M U)还大的广播数据包。 (in ows Sckets AP 没有提供发现
TU的机制,但是它不会小于51 个字节 。W n ock2。 版中已被废弃。
pe d In o:指向销售商的数据结构的指针。这个结构的定义如果有超出了W dowsSo kets规范的范围。W nSoc 。 0版中已被废弃。
设计过程
4。 1 新建对话框
启动Visual C++ 6。 ,新建对话框应用程序,工程名为sa j in对话框标题改为“主机名和 P地址”。
。 添加控件
删除掉对话框模板上的控件,添加新控件,如下表所示。
表 控件及其属性一览表
添加完控件后的对话框模板如下图所示。
图1添加完控件后的对话框模板图
4。 添加成员变量
打开ClassW zar对话框的Mmb Var ables标签 为下列
《计算机网络与通信》课程设计获取主机名和IP地址
控件添加成员变量。如下表所示。
表2控件及变量属性
。 4为控件添加映射消息
选择M C Cla Wiza d对话框的M s ge Ma s标签为以下控件添加映射消息。如下表所示。
表3 控件映射消息
45定义函数
在 an i D gh中定义一个r w函数。
bl c
oi r ();
4 添加代码
在 n i Dlg。 cpp文件中添加代码,实现功能。
添加程序代码如下
oid CS nj inlg: OnBu ton1 )
/ TO A d our contr l o fi a io andle cde er
Inv l da ;
v id CS nj inDlg :n t on2
// TODO Add our co tr l notif catio han ercode her
nOK ;
}
《计算机网络与通信》课程设计获取主机名和IP地址v dC an i Dlg: :On e k1 )
//TODO d ur cont o notif cat on h n l rcode her
mC = mC k1;/初始化
Dra
vo d CS j Dl : :Dr w(
l ientDC d (thi
n height
C o t fon ;
eigh
i (mCh 1
ont CreateF (2 10 0 FW_NORML fal e fa se,false,
GB 12CR EVICE_PR IS,
I _DEFAULT ECIS DE L_QUA T
EF _PITCH ”宋体" ;
else
tCreat o t 20 ,0 F_NOMA,f se false al e,
GB2312CHARS T OUT_D VICE_PR CI
CLI _EFALT_ REC S D AU LT_QUALITY,
EFALTPI CH,”楷体_GB2312”
Rec e t 1 25 3 6)
c。 Fi lSol dR c &rec ,RGB( 5 210,20 )
c e ectO e t fon ;d et kMod (TRASPAR NT)
//初始化如果不初始化 以下代码将无法执行
WAD ta d ai (WSS artu MAKEOD( ),&data !=)
c。 T Out(2 4 , 初始化错误无法获取主机信息。
}
a h st 55
/获取主机名
《计算机网络与通信》课程设计获取主机名和IP地址
ge hostname hos sizef host )==SOC E _RROR)
Te t t 5, 无法获取主机名”
}e
{
c Tex t 2 45 本机主机名为:”)
dc。 Tex ut 5 75 hos ;
}
//获取计算机 g hostb ame也需要初始化上面已初始化struct ho te t = ethostb name hos if(p==
cT x Out 25,45 无法获取计算机主机名及IP。 ”)
}else
{
/本机IP利用循环输出本机所有IPfor i t =0;-〉 hadd l ist i !=0 i++
struct n d inmm py(& n p〉 _ dr_l t i ,sizeof(s ruct n_ d r))dcTex ut ,heigh + )height/3 ”块网卡IP为 ” //除以只能正常
//显示两个 P,要想显示多个 P地址还需添加一个计算IP地址个数的循环
d 。 extOu 75,h ig t i+ )heigh /3, i et a i
WSC an p( ;
}
程序说明 函数nB tton1 调用In al ida 实现擦除功能 函数On utton1 调用OOK(实现退出功能 OnCh )作为触发主要功能程序ra()运行的函数Draw )函数定义了一个Cl en DC类的对象dc和一个f nt类的对象font。定义对象dc来实现将所获得的主机名和IP地址显示在对话框上定义对象 nt来设置字体样式。 设计icon并运行程序
在 e ourc Vie中擦除原ic ,为自己设计一个 on。然后
《计算机网络与通信》课程设计获取主机名和IP地址
将程序编译并链接,运行程序查看运行结果。
程序运行结果及分析
程序运行的最终效果如图所示。
图2 最终效果图
点击运行后,调用 aw 函数,r 函数调用get os ()和ge yho name(得到本地主机名和IP地址 并调用TextOu 显示在窗口的指定位置。
6心得体会
本次课设实现了获取本地主机名和IP地址的功能,并用基本对话框显示所获得的结果,可以说是成功的。有一个小缺点是要使程序显示出主机名和 P地址是通过点击复选框这不符合通常我们都是点击按钮的习惯但总体上我以为是成功的
为了做这个课设我确实花了一番心思。虽说有语言的基础但实际上从我拿到题目查资料到最终做出来,我有一种从零学起的感觉。这主要是因为VC+内容太多一时之间难以接受这么多。 当然这也从另一方面反映了VC++功能之强大,对这一点还从我查资料的过程中有所体会。这次课设最大的收获可以说是更进一步了解了什么是学习,最大的进步是学会了如何面对问题。以前遇到问题,我通常都会变得心浮气躁,甚至会想“罢工”,但这一次却没有。这一次的课设过程还是我的一个新认识的落实。说实话我是这学期才明白“钻研”是什么意思,我觉得所谓“钻研”其实和“死磕"很有点像,只不过“钻研"需要心平气和,因为不心平气和就不容易长久。我觉得我这次的课设就有点在和V “死磕的感觉。
参考文献
[1]管皓高永丽别样诠释—一个Visul C+老鸟 0年学习与开发心得北京:北京航空航天大学出版社,2012 11
梁海英Vi l ++程序设计北京清华大学出版社 013
3唐文超 ua 网络编程北京清华大学出版社 0 3