获取计算机IP地址和主机名及MAC地址
贵州大学实验报告
学院:计信学院 专业: 信息安全 班级:101
姓名 学号 实验组
实验时间 指导教师 成绩 实验项目名称 获取计算机IP地址和主机名及MAC地址
实1、掌握MFC程序
的基本方法;
验2、了解在该网络环境下利用Winsock获取IP地址的方法及实现原理; 目3、了解在该网络环境下利用Winsock获取计算机名的方法及实现原理。 的
实
要通过本次试验初步了解Winsock程序的编制,并掌握如何利用MFC进行程序设计,验
为以后自己编制类似的程序打下良好的基础。 原
理
实
利用winsock提供的相关函数进行MFC程序的编制,要求获取计算机IP地址和主验
机名,并显示在窗口上。 内
容
实
PC机 验
V C++6.0 环境 环
境
1. 启动Visual C++6.0开发环境
从“开始”菜单中选择“程序| Microsoft Visual Studio 6.0 | Microsoft Visual 实C++ 6.0”,显示Visual C++6.0开发环境窗口。
验2. 创建一个项目
(1)单击File菜单中的New选项,显示New(新建)对话框。 步(2)单击Project(项目)标签,在Project选项卡中,选择MFC AppWizard(exe)骤 (MFC 应用程序向导)。在Location(位置)文本框中指定一个路径,在Project Name
(项目名称)文本框中为项目输入一个名字(例如:Winsock_getIP),单击OK按钮。
(3)在弹出的MFC AppWizard-Step1of 4对话框中选择Dialog Based(对话框基
础)单选项,然后单击下一步按钮。
1
(4)在MFC AppWizard-Step2 of 4对话框中注意勾选windows sockets支持复选
框,在标
对话框中输入想显示的窗口标题(例如:获取主机名和IP地址),然后单击
下一步按钮。
(5)其余步骤选择默认值。
(6)最后在MFC AppWizard-Step4 of 4对话框中单击完成按钮,完成项目的建立。
主要实现函数程序清单:
//获得主机名
int CWinsock_getIPDlg::GetLocalHostName(CString &sHostName) {
char szHostName[256];
int nRetCode;
nRetCode = gethostname(szHostName,sizeof(szHostName));
if(nRetCode != 0)
{
return WSAGetLastError();
实 }
验 sHostName = szHostName;
结 return 0;
果 }
获得IP地址
int CWinsock_getIPDlg::GetIPAddress(const CString &sHostName, CString
&sIPAddress)
{
struct hostent FAR* lpHostEnt = gethostbyname(sHostName);
if(lpHostEnt == NULL)
{
return WSAGetLastError();
}
LPSTR lpAddr = lpHostEnt->h_addr_list[0];
if(lpAddr)
2
{
struct in_addr inAddr;
memmove(&inAddr,lpAddr,4);
sIPAddress = inet_ntoa(inAddr);
if(sIPAddress.IsEmpty())
{
return 0;
}
}
return 0;
}
获得MAC地址
void CWinsock_getIPDlg::GetMAC(CString &sMAC) {
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter=NULL;
DWORD dwRetVal;
pAdapterInfo=(IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
ULONG ulOutBufLen=sizeof(IP_ADAPTER_INFO);
if (GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)==ERROR_BUFFER_OVERFLOW)
{
free(pAdapterInfo);
pAdapterInfo=(IP_ADAPTER_INFO *)malloc(ulOutBufLen);
}
if((dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen))==NO_ERROR)
{
pAdapter=pAdapterInfo;
if(pAdapter)
sMAC.Format("%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x",
3
pAdapter->Address[0],
pAdapter->Address[1],
pAdapter->Address[2],
pAdapter->Address[3],
pAdapter->Address[4],
pAdapter->Address[5]);
}
}
对确定键的实现
void CWinsock_getIPDlg::OnOK() {
// TODO: Add extra validation here
int nRetCode;
nRetCode=GetLocalHostName(m_sHostName);
nRetCode=GetIPAddress(m_sHostName,m_sIPAddress);
GetMAC(m_sMAC);
UpdateData(FALSE);
}
void CWinsock_getIPDlg::OnCancel() {
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
4
点击确定后:
点击取消。
实
1.函数GetLocalHostName(Cstring& sHostName)中的形参是出口参数还是入
验
口参数,
总
答:是入口参数。
结
2.函数GetIPAddress(const Cstring& sHostName,Cstring& sIPAddress)
5
中的形参是出口参数还是入口参数,
答:是入口参数。
3.在上面程序中我们并没有让确定按钮发挥作用,看看能否将程序改为不要
一运行就能在窗口上看到结果,而需要点击确定按钮后才看到结果,请说明
如何做,
答:进入其成员函数,添加如下语句:
int nRetCode;
nRetCode=GetLocalHostName(m_sHostName);
nRetCode=GetIPAddress(m_sHostName,m_sIPAddress);
GetMAC(m_sMAC);
UpdateData(FALSE);
指
导
教
师
意
见 签名: 年 月 日 注:各学院可根据教学需要对以上栏木进行增减。表格内容可根据内容扩充。
6