网站导航网学 原创论文 网站设计 最新系统 最新研究 原创论文 获取论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计下载 > VC与C++类别 > 正文

基于VC++学校机房IP地址自动设置系统

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/05/14

以下是网学网为您推荐的VC与C++类别-基于VC++学校机房IP地址自动设置系统,希望本篇文章对您学习有所帮助。

QQ交谈客服咨询,网学网竭诚为您服务,本站永久域名: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
论文文章部分只是部分简介,如需了解更多详情请咨询本站客服!QQ交谈QQ3710167

  • 上一篇资讯: VC++多种排序算法研究
  • 原创论文

    设为首页 | 加入收藏 | 论文首页 |原创论文 |
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师