实验室计算机的IP地址自动设置程序服务器端的设计与实现论文Word格式文档下载.docx
《实验室计算机的IP地址自动设置程序服务器端的设计与实现论文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验室计算机的IP地址自动设置程序服务器端的设计与实现论文Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
1.2.1ADO1
1.2.2多线程1
1.2.1网络广播2
1.3系统开发环境2
1.3.1系统软件环境2
1.3.2工具简介2
2系统概述3
3系统模块设计与实现4
3.1总体设计4
3.1.1系统结构设计4
3.1.2通信协议6
3.1.3数据库设计6
3.2编码实现6
3.2.1配置模块6
3.2.2接收请求模块9
3.2.3处理请求模块11
3.2.4发送应答模块14
4软件测试16
结论18
参考文献18
致谢19
声明20
1引言
1.1课题背景
目前,对学校的实验室来说,IP地址的分配和管理是管理员比较重视的一个问题。
而大部分管理员都采用的是DHCP技术来实现,DHCP技术是通过网络内一台服务器提供相应的网络配置服务来实现的,可以为网络终端设备提供临时的IP地址、默认网关、DNS服务器等网络配置。
虽然DHCP技术可以为用户接入网络提供方便,但还存在一些弊端,例如:
IP地址具有随机性,用户的IP地址是随机分配的,具有不确定性;
访问权限会发生变化,如果用户的访问权限是基于IP地址划分的,则访问权限随IP地址不同而变化;
不可被访问,通过DHCP获得的IP地址具有不确定性,用户被访问难度较大。
本系统对访问服务器的客户端网卡地址和分配其的IP地址进行记录,通过网卡地址来标识网内某一具体主机,并分配其固定的IP地址,从而弥补以上的一些不足之处。
1.2主要采用技术
1.2.1ADO
ADO(ActiveXDataObjects,ActiveX数据对象)是Microsoft为强大的数据访问接口OLEDB(对象链接和嵌入数据库)而设计的,是一个便于使用的应用层的编程接口。
使用ADO编写的应用程序可以通过OLEDB提供者访问和操作数据库服务器中的数据。
ADO不仅可以访问关系型数据库,还可以访问非关系型数据库。
同时由于OLEDB是基于COM接口的技术,使用这种技术可以直接对数据库的驱动程序进行访问,从而大大提供了访问速度。
ADO最主要的优点是易于使用、速度快、内存支出少和磁盘冗余小。
ADO在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。
1.2.2多线程
多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。
线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。
多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。
如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。
多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的。
1.2.3网络广播
网络广播是指一个节点同时向相同域中的其它所有节点传输数据包的过程。
组播是一种特殊的广播,其中一组请求收听的选定用户将收到广播。
广播传输通常在局域网(如以太网)中进行,但有时也发生在虚拟局域网(VLAN)中。
IPv6支持单播(Unicast)、组播(Multicast)以及任意播(Anycast)三种类型,IPv6中没有关于广播(Broadcast)的具体划分,而是作为组播的一个典型。
网络广播中涉及以下重要概念:
广播域(BroadcastDomain):
这是一个限定区域,其中的所有设备都可以共享信息。
换句话说,与网络相连,且负责接收广播的所有设备都是同一广播域的一部分。
在一个共享以太网中,工作站通过共享媒体将帧广播到其它所有节点。
其它节点收听广播,只接收寻址到它们的帧。
因此,共享以太网中的所有节点都属于同一广播域。
此外通过虚拟局域网技术可以创建一个虚拟广播域。
广播地址(BroadcastAddress):
这是一个特殊地址,当数据包可以寻址到该地址时,可以帮助所有设备打开和处理信息。
例如,MAC地址,格式为1xFFFFFFFF是一种广播地址;
IP地址255.255.255.255是通用广播地址。
任何设备都将打开寻址到广播地址的信息,并将它们传送到下一个工作站。
广播风暴(BroadcastStorm):
当主机系统响应一个在网上不断循环的广播数据包或者试图响应一个没有应答的系统时就会发生广播风暴。
随着网络数据包数量的增加,广播风暴可能会引起网络拥塞问题。
为防止广播风暴的发生,需要细心配置网络以阻止非法广播信息的进入。
1.3系统开发环境
1.3.1系统软件环境
本系统采用的软件工具有:
开发工具:
VC++6.0
数据库:
MicrosoftOfficeAccess2003
1.3.2工具简介
VisualC++6.0是微软公司重点推出的核心产品之一,它在原MFC类库基础上进行了完善和扩充,功能更强,性能更优,使用更方便。
MFC是指MicrosoftFoundationClass,它封装了WindowsAPI的数据结构、函数及宏,以面向对象的类的形式供程序开发者编写各种类型的程序,包括Internet、数据库和多媒体方面的程序。
VisualC++6.0类库在以下方面比前期版本功能更强。
1.VisualC++6.0支持动态HTML。
通过AppWizard可以轻松的编写基于Web浏览器的应用程序。
新的CHtmlView类封装了InternetExploer浏览器的功能,这样可以方便的编写浏览器风格的应用程序。
2.VisualC++6.0支持WindowsDNA(分布式Internet应用程序)架构。
DNA技术完全支持MicrosoftBackOffice服务器方便的控件,包括微软的SQLServer,TransactionServer和MessageServer。
3.VisualC++6.0支持更多类型的ATL,包括DLL库、EXE文件、Web控件、数据库和MicrosoftBackOffice应用程序。
4.VisualC++6.0访问数据库的能力更强。
它完全支持最新的微软数据库标准OLEDB,通过COLEDBRecordView类可以方便的浏览OLEDB数据库。
2系统需求概述
本系统的主要目标是实现实验室计算机IP地址的自动分配和设置,将客户端的IP地址设置为固定IP地址。
服务器可以安装在局域网内任意一台计算机上。
实现方式主要有两种,一、由服务器自动为客户端分配固定的IP地址。
当客户端第一次运行的时候,服务器自动为客户端分配一个IP地址,同时将客户端的网卡地址和分配给其的IP地址记录在数据库里,当客户端重新运行再次请求的时候,服务器从数据库中提取记录的IP地址,分配给客户端。
二、由管理员手动为客户端分配固定IP地址。
管理员需要知道客户端的网卡地址,将客户端的网卡与对应匹配的IP地址直接录入Access数据库。
当服务器收到客户端请求的时候,服务器从数据库中根据客户端的网卡地址查找对应IP地址,将此IP地址分配给客户端。
由于某种原因,学生做实验时可能需要重新配置IP地址从而造成IP地址混乱的现象,通过重新启动客户端,可将各客户端IP地址还原。
计算机IP地址固定可以方便根据IP地址设计计算机的权限和进行访问。
系统具有一定的灵活性,如果客户端分配到的IP地址与其它计算机重合(可能是由于手工配置静态IP),客户端会发送二次请求,服务器会分配客户端一个临时的IP地址但并不记录入数据库,在一定程度上保证了客户端IP地址的可用性。
当客户端重新启动发出请求时,服务器为客户端分配数据库中记录的IP地址。
3系统模块设计与实现
3.1总体设计
3.1.1系统结构设计
系统的主要功能需求为:
配置分配的IP地址范围,接收客户端的请求,处理请求为客户端分配IP地址,将应答信息发送给客户端。
根据系统需求可以将系统划分为以下主要模块。
模块名称:
配置系统信息
功能描述:
配置服务器为客户端分配的IP地址范围,服务器保留的IP地址,网关,子网掩码等信息。
实现方式:
服务器并不是每次启动都需要配置IP信息,配置模块在单独的进程中实现。
有对话框界面进行人机交互,将配置信息保存到系统盘的Windows目录下的一个配置文件中,主程序运行时从配置文件中读取配置信息。
接收请求
接收网络发送来的请求包,验证请求包的正确性和完整性,并将请求信息保存。
功能在单独的线程中实现。
虽然客户端与服务器物理上在一个局域网内,但并不能保证逻辑上在一个网段内,所以客户端不知道服务器所在。
为了使客户端发出的请求服务器能够正确接收,客户端采用数据链路层广播的方式发送请求。
收到客户端请求后,通过验证包头信息判断请求包的正确性,将请求信息写入请求队列,没有请求到达线程在接收请求处阻塞。
网络请求的接收采用Windows套接字编程实现。
互斥资源的访问采用信号量机制。
处理请求
从请求队列中读取请求信息,根据请求信息为客户端分配IP地址,将应答信息写入发送队列。
功能在单独的线程中实现。
从配置文件中读取配置信息,判断管理员是否重新配置过,如果重新配置过则清空数据库记录。
从请求队列中读取请求信息,判断是一次请求还是二次请求。
一次请求,从数据库中根据网卡地址查找分配给其的IP地址,找到则把分配的IP地址写入发送队列,找不到则将最小的IP地址分配给其并写入数据库和发送队列,最小IP地址向上递增。
二次请求,将最大IP地址分配给其但不写入数据库,写入发送队列,最大IP地址递减。
发送应答
从发送队列中读取应答信息,将子网掩码,网关等信息封装为应答包,发送给客户端。
从配置文件中读取分配的子网掩码和网关。
从发送队列中读取客户端的IP地址和分配给其的IP地址。
因为不确定客户端和服务器是否在同一网段,所以还是采用广播的方式发送应答信息包。
将子网掩码和网关封装进应答包以广播的形式发送出去。
网络应答的发送采用Windows套接字编程实现,互斥资源的访问采用信号量机制。
系统的结构如图:
图1系统模块结构
3.1.2通信协议
客户端和服务器都不知道彼此的网络配置信息,网络通信采用数据链路层广播的形式,请求包和应答包均可到达目的地。
网络通信协议定义如下:
一次请求包:
包头(reqip:
)+包体(网卡地址:
计算机名)
二次请求包:
包头(REQIP:
应答包:
包头(repip:
)+包体(客户端原IP地址:
分配给客户端的IP地址:
子网掩码:
网关)
3.1.3数据库设计
系统数据库只记录客户端的网卡地址、分配给客户端的IP地址和客户端的计算机名。
数据库设计如下:
数据库名称:
IpAddr
表名:
IPaddress
表1数据库表结构
字段名称
数据类型
说明
mac
文本
网卡地址
ip
ip地址
pcname
计算机名
3.2编码实现
3.2.1配置模块
配置模块的主要功能是配置为客户端分配的IP地址范围、保留的IP地址、子网掩码和网关。
模块流程图如下:
图2配置模块流程图
主要实现代码为:
//得到用户输入信息
m_maxIp.GetWindowText(maxIp);
m_minIp.GetWindowText(minIp);
m_netmask.GetWindowText(netMask);
m_netgate.GetWindowText(netGate);
//判定用户输入的合法性
if(maxIp.IsEmpty()||minIp.IsEmpty())
{
MessageBox("
输入的ip地址范围不能为空"
);
return;
}
if(netMask.IsEmpty()||netGate.IsEmpty())
MessageBox("
子网掩码或网关不能为空!
"
if(!
cmpIPaddr((char*)(LPCTSTR)minIp,(char*)(LPCTSTR)maxIp))
地址段范围不合法!
//将配置信息写入配置文件
WritePrivateProfileString("
FLAG"
"
flag"
true"
IPaddrSer.ini"
//写修改标志位
MAXIP"
maxip"
maxIp,"
//写最大IP地址
MINIP"
minip"
minIp,"
//写最小IP地址
DISABLEIP"
NULL,NULL,"
//清空保留IP地址
//重写保留IP地址
maxDisIpNo=m_disip.GetCount();
while(item<
maxDisIpNo)
{
m_disip.GetText(item,disIp);
disIp,"
0"
item++;
NETMASK"
netmask"
netMask,"
//子网掩码
NETGATE"
netgate"
netGate,"
//写网关
Returntrue;
}
3.2.2接收请求模块
接收请求模块的主要功能是监听网络上的广播请求,验证请求包的正确性,将请求信息写入请求队列。
图3接受请求模块流程图
主要实现代码:
if((nbSize=recvfrom(sockListener,buf,sizeof(buf),0,(SOCKADDRFAR*)&
saClient,&
nSize))==SOCKET_ERROR)//没有数据到达,线程将在此处阻塞
{
MessageBox(NULL,"
receivepackagefail!
Error!
MB_OK);
Log.WriteLog("
continue;
}
chartemp[6];
//用于提取包头
memcpy(temp,buf,5);
temp[5]=0;
if(strcmp(temp,(char*)(LPCTSTR)PakHead)==0)//为第一次请求包
{
//请求信息写入结点
memcpy(&
pak,buf,npak);
memcpy(addr.mac,pak.macaddr,12);
addr.mac[12]=0;
strcpy(addr.pcname,pak.body);
strcpy(addr.ip,inet_ntoa(saClient.sin_addr));
CStringmacaddr="
receivearequest,theMacaddressis"
;
CStrings=addr.mac;
macaddr=macaddr+s;
Log.WriteLog((char*)(LPCTSTR)macaddr);
//写日志
if(Write()==false)//将请求信息存放在结点后写入请求队列
MessageBox(NULL,"
writetoqueuefail!
Log.WriteLog("
recptr->
AddString(macaddr);
//控件上显示请求信息
if(strcmp(temp,"
REQIP"
)==0)//二次请求包
memcpy(&
strcpy(addr.mac,"
strcpy(addr.pcname,pak.body);
strcpy(addr.ip,inet_ntoa(saClient.sin_addr));
warning!
receivearequest,theMacaddressis"
CStrings=pak.macaddr;
macaddr=macaddr+s;
Log.WriteLog((char*)(LPCTSTR)macaddr);
if(Write()==false)//将请求信息写入队列
{
MessageBox(NULL,"
Log.WriteLog("
}
recptr->
3.2.3处理请求模块
处理模块请求主要功能是为客户端分配对应的IP地址,通过查询数据库为客户端分配固定的IP地址。
图4处理请求模块流程图
主要实现代码如下:
GetPrivateProfileString("
000"
flag,sizeof(flag),"
//读取修改标志位
if(strcmp(flag,"
)==0)//判断管理员是否重新配置过
if(!
DeleteAll())//清空数据库记录
deleteDBrecordfail"
returnfalse;
WritePrivateProfileString("
FL