以下是网学网为您推荐的VC与C++类别-基于VC++学校机房IP地址自动设置系统,希望本篇文章对您学习有所帮助。
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn |
1.1 系统的实现 在分析并设计好了本客户端程序以后,我在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) { // 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); if(lRet != ERROR_SUCCESS) { // AfxMessageBox("Autorun Failed"); } } …………………(省略) ----------------------------------------------------------------------------------------------------------------- 二、初始化本机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; } …………………(省略) ----------------------------------------------------------------------------------------------------------------- 三、将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; } if(ERROR_SUCCESS != RegSetValueEx(hKey, "DefaultGateway", 0, REG_MULTI_SZ, (unsigned char*)mszDefaultGateway, nGate)) { return FALSE; } …………………(省略) ----------------------------------------------------------------------------------------------------------------- 四、通告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); …………………(省略) ----------------------------------------------------------------------------------------------------------------- 五、初始化本地客户端套接字信息。首先,加载套接字库。然后,创建套接字并设置套接字选项为广播。接着,再初始化本地套接字信息。最后,绑定套接字到客户端特定的端口。本部分的主要代码如下: ----------------------------------------------------------------------------------------------------------------- …………………(省略) // 创建套接字 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) { AfxMessageBox("Bind Error: %d", WSAGetLastError()); WSACleanup(); return FALSE; } …………………(省略) ----------------------------------------------------------------------------------------------------------------- 六、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; } } // 创建SendThread线程 while (TRUE) { HANDLE hSend; hSend = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)SendThread, (LPVOID)hWnd, 0, NULL); if (hSend != NULL) { CloseHandle(hSend); break; } } |
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT |
本文选自计算机毕业设计http://myeducs.cn |