关键代码:
//初始化WinSock
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2, 0), &WSAData) != 0) { }
//获得本地计算机主机名称 CString strName = _T(\);
gethostname(strName.GetBuffer(1024), 1024); strName.ReleaseBuffer();
struct hostent* pHostEnt = gethostbyname(strName); if(pHostEnt == NULL) { }
//获得本地计算机IP地址 CString strText = _T(\);
strText += _T(\本地计算机的IP地址:\\n\); int n = 0;
while (pHostEnt->h_addr_list[n] != NULL) {
CString strTemp = _T(\);
strTemp.Format(_T(\), (pHostEnt->h_addr_list[n][0] & 0x00FF), return; return;
(pHostEnt->h_addr_list[n][1] & 0x00FF), (pHostEnt->h_addr_list[n][2] & 0x00FF), (pHostEnt->h_addr_list[n][3] & 0x00FF));
}
AfxMessageBox(strText); //清理WinSock WSACleanup();
strText += strTemp; n++;
运行结果:
6
图3 主机IP
5.3 MAC地址模块设计
添加按钮button并设置其caption为“MAC地址” ,使用getadaptersinfo()获取网卡信息。结构体IP_ADAPTER_INFO包含本地计算机某一个网络适配器的信息。 关键代码:
DWORD nLength = 0;
if (GetAdaptersInfo(NULL, &nLength) != ERROR_BUFFER_OVERFLOW) {
return;
} IP_ADAPTER_INFO* pAdapterInfo = (IP_ADAPTER_INFO*)new BYTE[nLength]; //获得本地
计算机网卡信息
if (GetAdaptersInfo(pAdapterInfo, &nLength) != ERROR_SUCCESS) { }
//获得本地计算机MAC地址
CString strText = _T(\本地计算机的MAC地址:\\n\); IP_ADAPTER_INFO * pCurrentAdapterInfo = pAdapterInfo; while (pCurrentAdapterInfo != NULL) {
//获得每个网卡的MAC地址 CString strTemp = _T(\);
strTemp.Format(_T(\), delete[] pAdapterInfo; return;
pCurrentAdapterInfo->Address[0], pCurrentAdapterInfo->Address[1], pCurrentAdapterInfo->Address[2], pCurrentAdapterInfo->Address[3],
7
pCurrentAdapterInfo->Address[4], pCurrentAdapterInfo->Address[5]);
}
AfxMessageBox(strText); delete[] pAdapterInfo;
strText += strTemp;
pCurrentAdapterInfo = pCurrentAdapterInfo->Next;
运行结果:
图 4 MAC地址
5.4 DNS模块设计
添加按钮button并设置其caption为“DNS”,要用到的函数是DWORD GetNetworkParams(PFIXED_INFO pFixedInfo,PULONG pOutBufLen) 参数及其功能说明如下:
pFixedInfo :输出指向FIXED_INFO结构的指针,该结构是用来获取本地计算机的网络参数。
pOutBufLen :输入指向一个ULONG变量的指针,该ULONG变量指向pFixedInfo结构的大小。
功能:函数GetNetworkParams()可以获取本地计算机的网络参数,从而获得计算机的DNS设置。成功,返回TRUE;失败,返回FALSE。该函数在头文件“Iphlpapi.h”中声明,由库文件“Iphlpapi.lib”来支持。 关键代码:
FIXED_INFO * FixedInfo;
ULONG ulOutBufLen; DWORD dwRetVal;
8
//IP_ADDR_STRING描述IP 地址链表的节点。 IP_ADDR_STRING * pIPAddr;
FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, sizeof(FIXED_INFO)); ulOutBufLen = sizeof(FIXED_INFO); //获取本机网络参数 GetNetworkParams
if (ERROR_BUFFER_OVERFLOW == GetNetworkParams(FixedInfo, &ulOutBufLen)) {
GlobalFree(FixedInfo);
FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, ulOutBufLen); if (dwRetVal = GetNetworkParams(FixedInfo, &ulOutBufLen)) { } else {
CString strHostName;
CString strDomainName; strDomainName.Format(\域名:%s\, printf(\获取网络参数失败.返回值: x\\n\, dwRetVal);
FixedInfo->DomainName);
} }
CString strDNS; //DnsServerList 本机采用的DNS服务器链表
strDNS.Format(\服务器:%s\, FixedInfo->DnsServerList.IpAddress.String); CString str;
str.Format(\, strHostName, strDomainName, strDNS); MessageBox(str);
pIPAddr = FixedInfo->DnsServerList.Next; while (pIPAddr) { CString strIPAddr; }
strIPAddr.Format(\备选DNS服务器是:%s\, pIPAddr->IpAddress.String); MessageBox(strIPAddr); pIPAddr = pIPAddr->Next;
9
运行结果:
图 5 DNS
图 6 备选DNS 1 图 6 备选DNS1
图 7备选DNS2
5.5 网络协议模块设计
添加按钮button并设置其caption为“网络协议”WSADATA结构被用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息。这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。
WSAStartup,是Windows Sockets Asynchronous的启动命令、Windows下的
10