实验室计算机的IP地址自动设置程序
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
3.3 系统的实现
在分析并设计好了本客户端程序以后,我在Windows2003SP1 + Visual C++ 6.0SP6 +PlatformSDK_Svr2003SP1的环境下实现了本客户端程序。下面分别介绍各个功能的具体实现。
一、随开机自启动的功能的实现。首先,获取System32目录的系统路径和本程序所在的系统路径。然后,检测System32目录下面是否存在本程序,如果不存在则拷贝自身到System32目录下面。接着,再把本程序写入注册表的开机启动项里面,以实现开机自启动的功能。本部分的主要代码如下:
-----------------------------------------------------------------------------------------------------------------
…………………(省略)
// 获取System32的路径
if (GetSystemDirectory(SysPath, sizeof(SysPath)) == 0)
{
// AfxMessageBox("Get System32 Path Failed");
}
// 获取本程序当前路径和名字
if (GetModuleFileName(NULL, FilePathAndName, sizeof(FilePathAndName)) == 0)
【买计算机毕业论文就到www.think58.com】 think58.com
[资料来源:THINK58.com]
{
// AfxMessageBox("Get Current File Path And Name Failed");
}
// 拷贝本程序到System32
LPSTR lpFileNewPathAndName;
lpFileNewPathAndName = lstrcat(SysPath, "\\");
lpFileNewPathAndName = lstrcat(lpFileNewPathAndName, lpFileName);
// 判断System32下是否存在本文件
if (PathFileExists(lpFileNewPathAndName) == FALSE)
{
// 如果不存在就拷贝
if (CopyFile(FilePathAndName, lpFileNewPathAndName, FALSE) == 0)
{
// AfxMessageBox("Copy File To System32 Failed");
}
}
// 写开机自启动的注册表键值
LPCTSTR lpRegSubPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" ;
HKEY hKey;
LONG lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, lpRegSubPath, 0,
KEY_WRITE, &hKey);
if(lRet == ERROR_SUCCESS)
{
DWORD dwRet = strlen(lpFileNewPathAndName);
lRet = RegSetValueEx( hKey, lpRegKeyName, 0, REG_SZ,
(BYTE *)lpFileNewPathAndName, dwRet);
RegCloseKey(hKey);
[来源:http://www.think58.com]
if(lRet != ERROR_SUCCESS)
{
// AfxMessageBox("Autorun Failed");
}
}
…………………(省略)
----------------------------------------------------------------------------------------------------------------- think58好,好think58 [来源:http://www.think58.com]
二、初始化本机IP地址等网络参数。首先,随机产生网络参数信息。然后获取网卡的信息以填充特定结构体,以便配置网络参数。接着,在填充好了相关结构体后,通过写注册表的方式,把新的网络参数写入注册表,最后再调用未公布的API用以通告网络参数的更改,以使新配置的网络参数立即生效。本部分的主要代码如下:
-----------------------------------------------------------------------------------------------------------------
…………………(省略)
if (GetAdaptInfo()) // 获取网卡信息填充m_pAdapterInfo指向的结构体
{
if (SetIP(clientip,clientmask,clientgate))
{
return TRUE; // 设置IP成功则返回TRUE
}
}
…………………(省略)
if (!SetIPToReg(pAdapterName, pIPAddress, pSubnetMask, pDefaultGateway))
{
return FALSE;
}
if (!NotifyIPChange(nIndex, pAdapterName, pIPAddress, pSubnetMask))
{
return FALSE;
}
…………………(省略)
think58好,好think58 [版权所有:http://think58.com]
----------------------------------------------------------------------------------------------------------------- [资料来源:http://think58.com]
三、将IP地址等网络参数写入注册表。首先,打开注册表,接着对特定的键写入信息。最后再关闭注册表。本部分的主要代码如下:
-----------------------------------------------------------------------------------------------------------------
…………………(省略)
HKEY hKey;
string strKeyName = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
strKeyName += pAdapterName;
if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,
strKeyName.c_str(), 0, KEY_WRITE, &hKey))
{
return FALSE;
}
…………………(省略)
if(ERROR_SUCCESS != RegSetValueEx( hKey, "IPAddress", 0, REG_MULTI_SZ,
(unsigned char*)mszIPAddress, nIP))
{
return FALSE;
}
if(ERROR_SUCCESS != RegSetValueEx( hKey, "SubnetMask", 0, REG_MULTI_SZ,
(unsigned char*)mszSubnetMask, nMask))
{
return FALSE;
} think58.com
[来源:http://think58.com]
if(ERROR_SUCCESS != RegSetValueEx(hKey, "DefaultGateway", 0, REG_MULTI_SZ,
(unsigned char*)mszDefaultGateway, nGate))
{
return FALSE;
}
…………………(省略)
-----------------------------------------------------------------------------------------------------------------
copyright think58
四、通告IP地址等网络参数的更改。该功能的实现是通过调用未公布的API来实现的。本部分的主要代码如下:
-----------------------------------------------------------------------------------------------------------------
…………………(省略)
MultiByteToWideChar(CP_ACP, 0, pAdapterName, -1, wcAdapterID,256);
if ((hDhcpDll = LoadLibrary("dhcpcsvc")) == NULL)
{
return FALSE;
}
if ((pDhcpNotifyProc = (DHCPNOTIFYPROC)GetProcAddress(hDhcpDll,
"DhcpNotifyConfigChange")) != NULL)
{
if ((pDhcpNotifyProc)(NULL, wcAdapterID, TRUE, nIndex, inet_addr(pIPAddress),
inet_addr(pSubnetMask), 0) == ERROR_SUCCESS)
{
bResult = TRUE;
}
}
FreeLibrary(hDhcpDll);
…………………(省略)
----------------------------------------------------------------------------------------------------------------- [资料来源:http://www.THINK58.com]
五、初始化本地客户端套接字信息。首先,加载套接字库。然后,创建套接字并设置套接字选项为广播。接着,再初始化本地套接字信息。最后,绑定套接字到客户端特定的端口。本部分的主要代码如下:
-----------------------------------------------------------------------------------------------------------------
…………………(省略)
// 创建套接字
sockClient = socket(AF_INET, SOCK_DGRAM, 0);
// 地址可复用设置
INT nReuse = SO_REUSEADDR;
setsockopt( sockClient, SOL_SOCKET, SO_REUSEADDR, (CHAR*)&nReuse, sizeof(INT));
// 设置套接字选项为广播
BOOL bBroadcast = TRUE;
setsockopt( sockClient, SOL_SOCKET, SO_BROADCAST, (CHAR*)&bBroadcast, sizeof(BOOL));
// 初始化本地客户端套接字地址信息结构体
SOCKADDR_IN addClient;
addClient.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addClient.sin_family = AF_INET;
addClient.sin_port = htons(CLIENTPORT);
// 绑定套接字到本地IP和端口(CLIENTPORT)
if(bind(sockClient, (SOCKADDR*)&addClient, sizeof(SOCKADDR)) != 0) 本文来自think58 [资料来源:http://think58.com]
{
AfxMessageBox("Bind Error: %d", WSAGetLastError());
WSACleanup();
return FALSE;
}
…………………(省略)
----------------------------------------------------------------------------------------------------------------- think58好,好think58
六、InitThread线程的实现。InitThread线程主要做一些初始化的工作,如设置开机自启动、获取计算机名、获取当前用户名、初始化本机IP地址等网络信息、初始化套接字、创建另外三个工作者线程等。本部分的主要代码如下:
-----------------------------------------------------------------------------------------------------------------
…………………(省略)
// 设置本程序为开机自启动
AutoRun();
// 获取计算机名
GetCompName(hWnd);
// 获取当前用户名
GetCurrentUserName(hWnd);
// 初始化本机IP地址
while (TRUE)
{
if (InitLocalIP())
{
break;
}
}
// 初始化本机套接字
while (TRUE)
{
if (InitSocket())
{
break;
}
}
// 创建RecvThread线程
while (TRUE)
{
HANDLE hRecv;
hRecv = CreateThread( NULL, 0,
(LPTHREAD_START_ROUTINE)RecvThread,(LPVOID)hWnd, 0, NULL);
if (hRecv != NULL)
{
CloseHandle(hRecv);
break;
think58.com [资料来源:http://www.THINK58.com]
}
}
// 创建SendThread线程
while (TRUE)
{
HANDLE hSend;
hSend = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)SendThread,
(LPVOID)hWnd, 0, NULL);
if (hSend != NULL)
{
CloseHandle(hSend);
break;
}
}
// 创建SetThread线程
while (TRUE)
{
HANDLE hSet;
hSet = CreateThread( NULL, 0,
(LPTHREAD_START_ROUTINE)SetThread,(LPVOID)hWnd, 0, NULL);
if (hSet != NULL)
{
CloseHandle(hSet);
break;
}
}
…………………(省略)
-----------------------------------------------------------------------------------------------------------------
think58好,好think58 [资料来源:http://THINK58.com]
think58.com [资料来源:THINK58.com]