实用网络程序设计实习实训报告.docx
- 文档编号:4351337
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:18
- 大小:120.60KB
实用网络程序设计实习实训报告.docx
《实用网络程序设计实习实训报告.docx》由会员分享,可在线阅读,更多相关《实用网络程序设计实习实训报告.docx(18页珍藏版)》请在冰豆网上搜索。
实用网络程序设计实习实训报告
苏州市职业大学
实习(实训)报告
名称实用网络程序设计实训
2014年1月4日至2014年1月6日共一周
学 院计算机工程学院
班级11应用技术3(CIW)
姓名管杨
院 长李金祥
系主任刘昭斌
指导教师吴建平于复生
一、实习(实训)目的和要求
通过实训,进一步掌握网络编程的知识和技能,掌握解决实际问题以及进行一定网络程序设计的能力。
实训注重网络程序的细节技术,进一步研究网络编程函数和相关MFC类,并且着重解决编程中可能存在的问题和难点,同时将这些知识应用于实际开发中,利用理论知识指导实践的开发。
二、实习(实训)内容
1、文件传输的设计
2、聊天软件的设计
3、广播程序的设计
4、本地计算机信息的查询
5、局域网信息的查询
学生按班级内序号分组,每5位同学一组,每人完成一个项目。
三、实习(实训)方式
■集中□分散□校内□校外
四、实习(实训)具体安排
以小组为单位,每个小组5台计算机,计算机之间通过局域网连接。
共同完成小组任务,并完成调试。
序号
教学内容题目
学时分配
小计
讲课
实训
1
文件传输的分析与设计
4
1
3
2
聊天软件的分析与设计
4
4
3
广播程序的分析与设计
4
4
4
本地计算机信息的查询
4
4
5
局域网信息的查询
4
4
6
项目整体测试
4
1
3
合计
24
2
22
五、实习(实训)报告内容(有指导书的可省略)
1、实训地点:
信2-506
2、实训时间:
2014年1月4日至2014年1月6日共一周
3、小组成员:
黄麟
4、具体内容:
本地计算机信息的查询
5、实训总结:
目录
1、设计分析与原理5
1.1本地计算机信息的查询需要有以下主要功能:
5
1.2关键技术的分析5
2、获取主机名和IP地址6
2.1获取主机名和IP地址程序界面:
6
2.2获取主机名和IP地址主代码如下:
6
2.3获取主机名和IP地址程序代码分析:
8
3、读取注册表9
3.1读取注册表程序界面:
10
3.2读取注册表程序流程图:
10
3.3读取注册表程序主代码如下:
11
3.4读取注册表程序代码分析:
14
4、查询本机网卡地址15
4.1查询本机网卡地址程序界面:
15
4.2查询本机网卡地址程序界面:
16
4.3查询本机网卡地址程序主代码如下:
17
4.4查询本机网卡地址程序代码分析:
20
5、实训总结21
1、设计分析与原理
1.1本地计算机信息的查询需要有以下主要功能:
获取主机名和IP地址
读取注册表
查询本机网卡地址
查询本机子网掩码
查询本机网关
查询本机DNS设置
1.2关键技术的分析
开发一个简单的查询工具,可以查询本机的基本软硬件配置,本机的基本网络配置,包括:
计算机名
IP地址
操作系统
CPU
网卡地址
子网掩码
DNS服务器
网关
内联网经常用在企业的局域网并使用分布式的应用程序,而分布式的应用程序宿主是本地计算机,如何正确地获得本地计算机的网络协议及配置信息,对于更深入地编写网络应用程序是一件很重要的事。
2、获取主机名和IP地址
为了在网络上区分不同的计算机,人们给每台计算机分配了一组用于标志该计算机的数字,称之为IP地址。
如今计算机大多数使用IP地址,但无论是因特网用户还是内联网用户,都希望使用主机名而不是难记的IP地址。
对于一台计算机来说,一般只有一个计算机名称,但是可以有多个IP地址。
我们设计的程序要能够获取计算机名,同时还要获取所有的IP地址。
2.1获取主机名和IP地址程序界面:
获取本地计算机名和IP地址可以通过读注册表获得,也可以使用WinSock库提供的相关函数来实现。
设计一个简单的获取本地主机名和IP地址小程序,界面如2-1所示:
图2-1获取主机名和IP地址程序界面
界面上有两个按钮和一个列表框,给列表框控件添加一个关联的成员变量m_show,类型是CListBox。
双击两个按钮,分别给它们添加消息处理函数。
2.2获取主机名和IP地址主代码如下:
voidCGetNameAndIPDlg:
:
OnGetname()
{
//初始化WinSock为2.0版本
WSADATAwsaData;
intret;
if((ret=WSAStartup(MAKEWORD(2,2),&wsaData))!
=0)
return;
charHostName[128];
BOOLbRet;
bRet=gethostname(HostName,128);
if(bRet!
=0){
MessageBox("获取计算机名错误!
","提示");
return;
}
CStringstrMeg=HostName;
strMeg="本机的计算机名是:
"+strMeg;
m_show.InsertString(-1,strMeg);
WSACleanup();
}
voidCGetNameAndIPDlg:
:
OnGetip()
{
//初始化WinSock为2.0版本
WSADATAwsaData;
intret;
if((ret=WSAStartup(MAKEWORD(2,2),&wsaData))!
=0)
return;
charHostName[128];
structhostent*pHost;
gethostname(HostName,128);
pHost=gethostbyname(HostName);
inti=0;
CStringstrIP;
while(pHost->h_addr_list[i]!
=NULL)
{
strIP=inet_ntoa(*(structin_addr*)pHost->h_addr_list[i]);
CStringstr="本机的IP地址:
"+strIP;
m_show.InsertString(-1,str);
i++;
}
WSACleanup();
}
2.3获取主机名和IP地址程序代码分析:
1)gethostname函数
该函数可以获取本地主机名,若无错误,返回0;否则,返回SOCKET_ERROR。
gethostname(char*name,intnamelen);
参数name:
用于指向所获取本地主机名的缓冲区地址。
参数namelen:
缓冲区的大小,以字节示。
2)gethostbyname函数
该函数可以从主机名数据库中得到对应的“主机”(由名字和地址标识)。
若无错误,函数返回一个指向hostent结构的指针,它可标识一个“主机”列表。
structhostent*FARgethostbyname(constchar*name);
参数name:
是主机名。
3、读取注册表
注册表是Windows程序员建造的一个复杂的信息数据库,它是多层次式的。
注册表由键(或称“项”)、子键(子项)和值项构成。
一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键。
一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。
一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。
“开始”—〉“运行”中输入"regedit"命令,然后回车,会弹出注册表编辑器界面
图3-1打开注册表界面
操作注册表使用CRegKey类
CRegKey类提供的几个重要函数:
Open函数——打开注册表
QueryValue函数——读注册表
SetValue函数——写注册表
Close函数——关闭注册表
3.1读取注册表程序界面:
获取本机的操作系统信息和CPU信息需要查询注册表,从注册表中读出所需要的信息,然后显示到界面上。
图3-2读取注册表程序界面
3.2读取注册表程序流程图:
图3-3读取注册表程序流程图
3.3读取注册表程序主代码如下:
CStringstrPath="SOFTWARE\\Microsoft\\Windows\\CurrentVersion";//注册表子键路径
CRegKeyregkey;//定义注册表类对象
LONGlResult;//LONG型变量-反应结果
charstrMes[50];
CStringstrShow;
DWORDdwSize=50;
lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);//打开注册表键
if(lResult!
=ERROR_SUCCESS)
{
AfxMessageBox("错误:
无法查询有关的注册表信息");
return;
}
//获取操作系统安装序列号值
memset(strMes,0,50);
regkey.QueryValue(strMes,"ProductId",&dwSize);
strShow=strMes;
strShow="操作系统安装序列号:
"+strShow;
m_showSoft.AddString(strShow);
regkey.Close();//关闭注册表
//获取操作系统名称、Windows的版本号和windows的版本名称
strPath="SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion";//注册表子键路径
lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);//打开注册表键
if(lResult!
=ERROR_SUCCESS)
{
AfxMessageBox("错误:
无法查询有关的注册表信息");
return;
}
//获取操作系统名称
memset(strMes,0,50);
regkey.QueryValue(strMes,"ProductName",&dwSize);
strShow=strMes;
strShow="操作系统名称:
"+strShow;
m_showSoft.AddString(strShow);
//获取windows的版本名称
memset(strMes,0,50);
regkey.QueryValue(strMes,"CSDVersion",&dwSize);
strShow=strMes;
strShow="Windows的版本名称:
"+strShow;
m_showSoft.AddString(strShow);
//获取Windows的版本号
memset(strMes,0,50);
regkey.QueryValue(strMes,"CurrentVersion",&dwSize);
strShow=strMes;
strShow="Windows的版本号:
"+strShow;
m_showSoft.AddString(strShow);
regkey.Close();//关闭注册表
}
voidCReadRegeditDlg:
:
OnHard()
{
CStringstrPath="HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0";//注册表子键路径
CRegKeyregkey;//定义注册表类对象
LONGlResult;//LONG型变量-反应结果
lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);//打开注册表键
if(lResult!
=ERROR_SUCCESS)
{
AfxMessageBox("错误:
无法查询有关的注册表信息");
return;
}
charstrMes[50];
DWORDdwSize=50;
CStringstrShow;
//获取CPU名称
regkey.QueryValue(strMes,"ProcessorNameString",&dwSize);
strShow=strMes;
strShow="CPU名称:
"+strShow;
m_showHard.AddString(strShow);
//获取CPU标识
regkey.QueryValue(strMes,"Identifier",&dwSize);
strShow=strMes;
strShow="CPU标识:
"+strShow;
m_showHard.AddString(strShow);
//获取CPU制造商
regkey.QueryValue(strMes,"VendorIdentifier",&dwSize);
strShow=strMes;
strShow="CPU制造商:
"+strShow;
m_showHard.AddString(strShow);
//获取CPU主频
regkey.QueryValue(dwSize,"~MHz");
strShow.Format("%d",dwSize);
strShow="CPU主频:
"+strShow;
m_showHard.AddString(strShow);
regkey.Close();//关闭注册表
3.4读取注册表程序代码分析:
1)open函数
打开注册表中的主键。
若成功,返回ERROR_SUCCESS,失败则返回错误值。
LONGOpen(HKEYhKeyParent,LPCTSTRlpszKeyName,REGSAMsamDesired=KEY_ALL_ACCESS);
参数hKeyParent:
需打开的键的句柄。
参数lpszKeyName:
需打开的键所在的注册表的路径。
参数samDesired:
注册表访问的权限,默认值为KEY_ALL_ACCESS。
2)QueryValue函数
读取注册表中键值项的键值,若成功,返回ERROR_SUCCESS,失败则返回错误值。
LONGQueryValue(DWORD&dwValue,LPCTSTRlpszValueName);
参数dwValue:
DWORD数据类型的键值。
参数lpszValueName:
所读取键值项的名称。
LONGQueryValue(LPTSTRszValue,LPCTSTRlpszValueName,DWORD*pdwCount);
参数szValue:
字符串数据类型的键值。
参数lpszValueName:
所读取键值项的名称。
参数pdwCount:
字符串的长度。
3)SetValue函数
LONGSetValue(DWORDdwValue,LPCTSTRlpszValueName);
参数dwValue:
需要写入的DWORD类型键值。
参数lpszValueName:
所写入的键值项名称,如果不存在,则增加一个新的键值项。
LONGSetValue(LPCTSTRlpszValue,LPCTSTRlpszValueName=NULL);
参数lpszValue:
需要写入的字符串类型键值。
参数lpszValueName:
所写入的键值项名称,如果不存在,则增加一个新的键值项。
4、查询本机网卡地址
众所周知,一个网卡对应唯一的MAC地址,对一些应用程序来说,获取网卡MAC地址有事是必要的,使用VC提供的NetBIOS网络编程接口可以方便获取网卡MAC地址。
程序运行后如图4-1所示。
4.1查询本机网卡地址程序界面:
图4-1查询本机网卡地址程序界面
界面上有一个按钮和一个列表框,按钮的功能是获取本机的MAC地址,并显示到列表框中。
给列表框添加一个关联成员变量m_show,类型是CListBox。
4.2查询本机网卡地址程序界面:
图4-2查询本机网卡地址程序流程图
4.3查询本机网卡地址程序主代码如下:
voidCGetMACDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCGetMACDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCGetMACDlg:
:
OnGetMAC()
{
NCBncb;//网络控制块
LANA_ENUMlana_enum;//该结构包含网卡数目及其索引
memset(&ncb,0,sizeof(ncb));//NCB结构清零
ncb.ncb_command=NCBENUM;
//向网卡发送NCBENUM命令,以获取当前计算机的网卡信息,
//如有多少个网卡,每张网卡的编号等
ncb.ncb_buffer=(unsignedchar*)&lana_enum;
ncb.ncb_length=sizeof(lana_enum);
UCHARuRetCode=Netbios(&ncb);
intnum;//标识网卡个数
MAC_ADDRESSmac_addr[5];//假设最多有5个网卡
if(uRetCode!
=0)
return;
num=lana_enum.length;
//对每一张网卡,以其网卡编号为输入编号,获取其MAC地址
for(inti=0;i { memset(&ncb,0,sizeof(ncb));//NCB结构重新清零 ASTATAdapter; //对选定的网卡发送一个NCBRESET命令,以便进行初始化 ncb.ncb_command=NCBRESET; ncb.ncb_lana_num=lana_enum.lana[i]; uRetCode=Netbios(&ncb); //指定返回的信息存放的变量 memset(&ncb,0,sizeof(ncb)); ncb.ncb_command=NCBASTAT; ncb.ncb_lana_num=lana_enum.lana[i];//指定网卡号 strcpy((char*)ncb.ncb_callname,"*"); ncb.ncb_buffer=(unsignedchar*)&Adapter; //指定返回的信息存放的变量Adapter ncb.ncb_length=sizeof(Adapter); //接着,发送NCBASTAT命令以获取网卡的信息 uRetCode=Netbios(&ncb); mac_addr[i].b1=Adapter.adapt.adapter_address[0]; mac_addr[i].b2=Adapter.adapt.adapter_address[1]; mac_addr[i].b3=Adapter.adapt.adapter_address[2]; mac_addr[i].b4=Adapter.adapt.adapter_address[3]; mac_addr[i].b5=Adapter.adapt.adapter_address[4]; mac_addr[i].b6=Adapter.adapt.adapter_address[5]; CStringstrMac; strMac.Format("第%d个MAC: %02X-%02X-%02X-%02X-%02X-%02X",i+1, mac_addr[i].b1,mac_addr[i].b2, mac_addr[i].b3,mac_addr[i].b4, mac_addr[i].b5,mac_addr[i].b6); m_show.InsertString(-1,strMac); } 参数pAdapterInfo: 指向IP_ADAPTER_INFO结构的指针 参数pOutBufLen: 一个ULONG变量的指针,表示指向pAdapterInfo结构的大小。 4.4查询本机网卡地址程序代码分析: 1)头文件和库文件 NetBIOS中所用的函数声明、常数等等均是在头文件nb30.h内定义的,使用NetBIOS还须连接库netapi32.lib #include #pragmacomment(lib,"Netapi32.lib") 2)Netbios函数 Win32应用程序可以使用NetworkBasicInput/OutputSystem(NetBIOS)接口与网络中的其他计算机上的应用程序进行通讯 UCHARNetbios(PNCBpncb); 参
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实用 网络程序设计 实习 报告