实用网络程序设计-实习(实训)报告

实用网络程序设计-实习(实训)报告

2023年6月28日发(作者:)

苏 州 市 职 业 大 学

实习(实训)报告

名称 实用网络程序设计实训

2014年1月4日至 2014年1月6日共一周

学 院 计算机工程学院

班 级 11应用技术3(CIW)

姓 名 管杨

院 长 李金祥

系 主 任 刘昭斌

指导教师 吴建平 于复生 一、实习(实训)目的和要求

通过实训,进一步掌握网络编程的知识和技能,掌握解决实际问题以及进行一定网络程序设计的能力。

实训注重网络程序的细节技术,进一步研究网络编程函数和相关MFC类,并且着重解决编程中可能存在的问题和难点,同时将这些知识应用于实际开发中,利用理论知识指导实践的开发。

二、实习(实训)内容

1、文件传输的设计

2、聊天软件的设计

3、广播程序的设计

4、本地计算机信息的查询

5、局域网信息的查询

学生按班级内序号分组,每5位同学一组,每人完成一个项目。 三、实习(实训)方式

■ 集中 □ 分散 □ 校内 □ 校外

四、实习(实训)具体安排

以小组为单位,每个小组5台计算机,计算机之间通过局域网连接。共同完成小组任务,并完成调试。

序号

1 文件传输的分析与设计

2 聊天软件的分析与设计

3 广播程序的分析与设计

4 本地计算机信息的查询

5 局域网信息的查询

6 项目整体测试

教学内容题目

4

4

4

4

4

4

合 计

学 时 分 配

小计 讲课

1

1

2

实训

3

4

4

4

4

3

22 24

五、实习(实训)报告内容(有指导书的可省略)

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地址主代码如下:

{

//初始化WinSock为2.0版本

WSADATA wsaData;

int ret;

if((ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0)

return;

void CGetNameAndIPDlg::OnGetname()

}

void CGetNameAndIPDlg::OnGetip()

{

struct hostent* pHost;

gethostname(HostName, 128);

pHost = gethostbyname(HostName);

//初始化WinSock为2.0版本

WSADATA wsaData;

int ret;

if((ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0)

char HostName[128];

return;

BOOL bRet;

bRet = gethostname(HostName, 128);

if( bRet!= 0 ){

}

CString strMeg = HostName;

strMeg = "本机的计算机名是:" + strMeg;

m_String(-1,strMeg);

WSACleanup();

MessageBox("获取计算机名错误!","提示");

return;

char HostName[128];

}

int i=0;

CString strIP;

while(pHost->h_addr_list[i] != NULL)

{

strIP = inet_ntoa(*(struct in_addr *)pHost->h_addr_list[i]);

CString str="本机的IP地址:" + strIP;

m_String(-1,str);

i++;

}

WSACleanup();

2.3获取主机名和IP地址程序代码分析:

1)gethostname函数

该函数可以获取本地主机名,若无错误,返回0;否则,返回SOCKET_ERROR。

gethostname (char* name, int namelen);

参数name:用于指向所获取本地主机名的缓冲区地址。

参数namelen:缓冲区的大小,以字节示。

2)gethostbyname函数

该函数可以从主机名数据库中得到对应的“主机”(由名字和地址标识)。若无错误,函数返回一个指向hostent结构的指针,它可标识一个“主机”列表。

struct hostent * FAR gethostbyname( const char* name );

参数name:是主机名。 3、读取注册表

注册表是Windows程序员建造的一个复杂的信息数据库,它是多层次式的。

注册表由键(或称“项”)、子键(子项)和值项构成。

一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键。一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。

一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。

“开始”—〉“运行”中输入"regedit"命令,然后回车,会弹出注册表编辑器界面

图3-1打开注册表界面

操作注册表 使用CRegKey类

CRegKey类提供的几个重要函数:

Open函数——打开注册表

QueryValue函数——读注册表

SetValue函数——写注册表

Close函数——关闭注册表 3.1读取注册表程序界面:

获取本机的操作系统信息和CPU信息需要查询注册表,从注册表中读出所需要的信息,然后显示到界面上。

图3-2读取注册表程序界面

3.2读取注册表程序流程图:

确定要操作的注册表项的路径打开注册表中要操作的路径读取指定的项的值关闭注册表

图3-3读取注册表程序流程图

3.3读取注册表程序主代码如下:

CRegKey regkey;//定义注册表类对象

LONG lResult;//LONG型变量-反应结果

char strMes[50];

CString strShow;

DWORD dwSize=50;

lResult=(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);//打开CString strPath="SOFTWAREMicrosoftWindowsCurrentVersion";//注册表子键路注册表键

if (lResult!=ERROR_SUCCESS)

{

}

//获取操作系统安装序列号值

memset(strMes,0,50);

alue(strMes,"ProductId",&dwSize);

strShow = strMes;

strShow = "操作系统安装序列号:" + strShow;

m_ing(strShow);

();//关闭注册表

//获取操作系统名称、Windows的版本号和windows的版本名称

strPath="SOFTWAREMicrosoftWindows NTCurrentVersion";//注册表子键路径

lResult=(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);//打开

AfxMessageBox("错误:无法查询有关的注册表信息");

return;

注册表键

if (lResult!=ERROR_SUCCESS)

{

}

}

AfxMessageBox("错误:无法查询有关的注册表信息");

return;

//获取操作系统名称

memset(strMes,0,50);

alue(strMes,"ProductName",&dwSize);

strShow = strMes;

strShow = "操作系统名称:" + strShow;

m_ing(strShow);

//获取windows的版本名称

memset(strMes,0,50);

alue(strMes,"CSDVersion",&dwSize);

strShow = strMes;

strShow = "Windows的版本名称:" + strShow;

m_ing(strShow);

//获取Windows的版本号

memset(strMes,0,50);

alue(strMes,"CurrentVersion",&dwSize);

strShow = strMes;

strShow = "Windows的版本号:" + strShow;

m_ing(strShow);

();//关闭注册表

void CReadRegeditDlg::OnHard()

{

CString strPath="HARDWAREDESCRIPTIONSystemCentralProcessor0";//注册表子键路径

CRegKey regkey;//定义注册表类对象

LONG lResult;//LONG型变量-反应结果

lResult=(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);//打开注册表键

if (lResult!=ERROR_SUCCESS)

{

}

char strMes[50];

DWORD dwSize=50;

CString strShow;

//获取CPU名称

alue(strMes,"ProcessorNameString",&dwSize);

strShow = strMes;

strShow = "CPU名称:" + strShow;

m_ing(strShow);

//获取CPU标识

alue(strMes,"Identifier",&dwSize);

strShow = strMes;

strShow = "CPU标识:" + strShow;

m_ing(strShow);

//获取CPU制造商

alue(strMes,"VendorIdentifier",&dwSize);

strShow = strMes;

strShow = "CPU制造商:" + strShow;

m_ing(strShow);

//获取CPU主频

alue(dwSize,"~MHz");

("%d",dwSize);

strShow = "CPU主频:" + strShow;

m_ing(strShow);

();//关闭注册表

AfxMessageBox("错误:无法查询有关的注册表信息");

return; 3.4读取注册表程序代码分析:

1)open函数

打开注册表中的主键。若成功,返回ERROR_SUCCESS,失败则返回错误值。

LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired =

KEY_ALL_ACCESS );

参数hKeyParent:需打开的键的句柄。

参数lpszKeyName:需打开的键所在的注册表的路径。

参数samDesired:注册表访问的权限,默认值为KEY_ALL_ACCESS。

2)Query Value函数

读取注册表中键值项的键值,若成功,返回ERROR_SUCCESS,失败则返回错误值。

LONG QueryValue( DWORD& dwValue, LPCTSTR lpszValueName );

参数dwValue:DWORD数据类型的键值。

参数lpszValueName:所读取键值项的名称。

LONG QueryValue( LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount );

参数szValue:字符串数据类型的键值。

参数lpszValueName:所读取键值项的名称。

参数pdwCount:字符串的长度。

3)SetValue函数

LONG SetValue( DWORD dwValue, LPCTSTR lpszValueName );

参数dwValue:需要写入的DWORD类型键值。

参数lpszValueName:所写入的键值项名称,如果不存在,则增加一个新的键值项。

LONG SetValue( LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );

参数lpszValue:需要写入的字符串类型键值。

参数lpszValueName:所写入的键值项名称,如果不存在,则增加一个新的键值项。 4、查询本机网卡地址

众所周知,一个网卡对应唯一的MAC地址,对一些应用程序来说,获取网卡MAC地址有事是必要的,使用VC提供的NetBIOS网络编程接口可以方便获取网卡MAC地址。程序运行后如图4-1所示。

4.1查询本机网卡地址程序界面:

图4-1查询本机网卡地址程序界面

界面上有一个按钮和一个列表框,按钮的功能是获取本机的MAC地址,并显示到列表框中。给列表框添加一个关联成员变量m_show,类型是CListBox。 4.2查询本机网卡地址程序界面:

定义NCB结构在NCB结构中设置NCBENUM命令调用Netbios,向网卡发送NCBENUM命令获取网卡的数目、编号等信息列表取一个网卡向网卡发送NCBRESET命令进行初始化向网卡发送NCBASTAT命令获取网卡地址还有下一块网卡吗?No结束Yes

图4-2查询本机网卡地址程序流程图

4.3查询本机网卡地址程序主代码如下:

void CGetMACDlg::OnPaint()

{

if (IsIconic())

{

}

else

{

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CGetMACDlg::OnQueryDragIcon()

CDialog::OnPaint();

// Draw the icon

on(x, y, m_hIcon);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (() - cxIcon + 1) / 2;

int y = (() - cyIcon + 1) / 2;

SendMessage(WM_ICONERASEBKGND, (WPARAM) eHdc(), 0);

CPaintDC dc(this); // device context for painting {

return (HCURSOR) m_hIcon;

}

void CGetMACDlg::OnGetMAC()

{

NCB ncb; //网络控制块

LANA_ENUM lana_enum; //该结构包含网卡数目及其索引

memset(&ncb, 0, sizeof(ncb) ); //NCB结构清零

_command = NCBENUM;

//向网卡发送 NCBENUM 命令,以获取当前计算机的网卡信息,

//如有多少个网卡,每张网卡的编号等

_buffer = (unsigned char *)&lana_enum;

_length = sizeof(lana_enum);

UCHAR uRetCode = Netbios(&ncb);

int num; //标识网卡个数

MAC_ADDRESS mac_addr[5];//假设最多有5个网卡

if (uRetCode != 0)

num = lana_;

//对每一张网卡,以其网卡编号为输入编号,获取其 MAC 地址

for (int i = 0; i < num; i++)

{

memset(&ncb, 0, sizeof(ncb) ); //NCB结构重新清零

ASTAT Adapter;

return;

//对选定的网卡发送一个 NCBRESET 命令,以便进行初始化

_command = NCBRESET;

_lana_num = lana_[i];

uRetCode = Netbios(&ncb );

//指定返回的信息存放的变量

memset(&ncb, 0, sizeof(ncb) );

_command = NCBASTAT;

_lana_num = lana_[i]; //指定网卡号

strcpy((char *)_callname, "*" );

_buffer = (unsigned char *)&Adapter;

//指定返回的信息存放的变量 Adapter

_length = sizeof(Adapter);

//接着,发送 NCBASTAT 命令以获取网卡的信息

uRetCode = Netbios(&ncb );

mac_addr[i].b1 = r_address[0];

mac_addr[i].b2 = r_address[1];

mac_addr[i].b3 = r_address[2];

mac_addr[i].b4 = r_address[3];

mac_addr[i].b5 = r_address[4];

mac_addr[i].b6 = r_address[5];

CString strMac;

("第%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_String(-1,strMac);

参数pAdapterInfo:指向IP_ADAPTER_INFO结构的指针

参数pOutBufLen:一个ULONG变量的指针,表示指向pAdapterInfo结构的大小。

4.4查询本机网卡地址程序代码分析:

1)头文件和库文件

NetBIOS中所用的函数声明、常数等等均是在头文件nb30.h内定义的,使用NetBIOS还须连接库

#include

#pragma comment(lib,"")

2)Netbios函数

Win32应用程序可以使用Network Basic Input/Output System(NetBIOS)接口与网络中的其他计算机上的应用程序进行通讯

UCHAR Netbios( PNCB pncb );

参数pncb:指向网络控制块的指针。

返回值放在pncb指向的结构体里。 5、实训总结

通过本次实训,我掌握了对主机名和IP地址的获取,利用代码文件进行实现和查询。我还学会了有关注册表的有关知识,如何打开并进行编辑。绘出流程图,写出主程序,并对相关函数进行了解释说明。我理解了如何查询本机网卡地址,通过编译代码,调试相关程序,成功查询。

我不仅对课上所学的知识进行很好的巩固,还学到了许多有用的课外知识,收获很多。在实训过程中,我也遇到了很多的困难,但后来都通过上网查阅资料以及向老师同学请教得到了解决,感谢老师和同学们的帮助。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687896901a54880.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信