实验室计算机的ip地址自动设置程序——服务器端的设计与实现—免费毕业设计论文内容摘要:

T_ERROR) //没有数据到达,线程将在此处阻塞 { MessageBox(NULL,receive package fail!,Error!,MB_OK)。 (receive package fail!)。 continue。 } char temp[6]。 //用于提取包头 开始等待请求到达初始化环境和套接字信息验证请求包的正确性将请求信息写入请求队列丢弃请求包TF 第 10 页 共 20 页 memcpy(temp,buf,5)。 temp[5]=0。 if(strcmp(temp,(char*)(LPCTSTR)PakHead)==0)//为第一次请求包 { //请求信息写入结点 memcpy(amp。 pak,buf,npak)。 memcpy(,12)。 [12]=0。 strcpy(,)。 strcpy(,i_ntoa())。 CString macaddr=receive a request, the Macaddress is。 CString s=。 macaddr=macaddr+s。 ((char*)(LPCTSTR)macaddr)。 //写日志 if(Write()==false)//将请求信息存放在 结 点后写入请求队列 { MessageBox(NULL,write to queue fail!,Error!,MB_OK)。 (write to queue fail!)。 } recptrAddString(macaddr)。 //控件上显示请求信息 } if(strcmp(temp,REQIP)==0)//二次请求包 { //请求信息写入结点 memcpy(amp。 pak,buf,npak)。 strcpy(,0)。 strcpy(,)。 strcpy(,i_ntoa())。 CString macaddr=warning ! receive a request, the Macaddress is。 CString s=。 macaddr=macaddr+s。 ((char*)(LPCTSTR)macaddr)。 if(Write()==false)//将请求信息写入队列 { 第 11 页 共 20 页 MessageBox(NULL,write to queue fail!,Error!,MB_OK)。 (write to queue fail!)。 } recptrAddString(macaddr)。 //控件上显示请求信息 处理请求模块 处理模块请求主要功能是为客户端分配对应的 IP 地址,通过查询数据库为客户端分配固定的 IP 地址。 模块流程图如下: 图 4 处理请求模块流程图 开始判断队列中是否有请求读出请求信息判断请求类别分配最大 IP 地址 ,最大 IP 递减查询该客户端的记录是否存在该客户端的记录分配最小 IP , 最小IP 递增分配信息记录数据库应答信息写入发送队列查询分配给该客户端的 IP 地址应答信息写入发送队列应答信息写入发送队列TF二次请求一次请求TF 第 12 页 共 20 页 主要实现代码如下: GetPrivateProfileString(FLAG,flag,000,flag,sizeof(flag),ni)。 //读取修改标志位 if(strcmp(flag,true)==0)//判断 管理员是否重新配置过 { if(!DeleteAll())//清空数据库记录 { MessageBox(NULL,delete DB record fail ,Error!,MB_OK)。 (delete DB record fail )。 return false。 } WritePrivateProfileString(FLAG,flag,false,)。 // 写入 flag 标志为 false } GetPrivateProfileString(MAXIP,maxip,0,MaxIp,sizeof(MaxIp),IPad)。 //初始化最大 ip 地址 GetPrivateProfileString(MINIP,minip,0,MinIp,sizeof(MinIp),IPaddr)。 //初始化最小 ip 地址 while(threadFlag) { if(Read()==false)//请求队列为空 { Sleep(100)。 continue。 } if(strcmp(,0))//一次请求包 { mac=。 strcpy(,)。 if(Search(mac,ip))//根据网卡地址数据库中查找 ip 地址并找到 { strcpy(,(char*)(LPCTSTR)ip)。 if(!Write())//将应答信息写入发送队列 { 第 13 页 共 20 页 MessageBox(NULL,Fail to write ipaddress to the queue! ,Error!,MB_OK)。 (Fail to write ipaddress to the queue! )。 continue。 } } else//没有找到要分配的 ip 地址 { if(ipcmp(MinIp,MaxIp)==0)//判断是否有剩余的 ip 地址分配 { MessageBox(NULL,ipaddress is not enough! ,Error!,MB_OK)。 (ipaddress is not enough! )。 continue。 } else { strcpy(,MinIp)。 //将最小 ip 分配 if(!Write())//应答信息写入发送队列 { MessageBox(NULL,Fail to write ipaddress to the queue! ,Error!,MB_OK)。 (Fail to write ipaddress to the queue! )。 continue。 } if(!AddRecord(mac,MinIp,))// 记录分配结果以备下次查询时分配相同的 ip { MessageBox(NULL,add ip fail,Error,MB_OK)。 (add ip fail)。 } if(AddMinIP(MinIp)==false)//最小 ip 增加 { 第 14 页 共 20 页 MessageBox(NULL,ipaddress is not enough! ,Error!,MB_OK)。 (ipaddress is not enough! )。 continue。 } WritePrivateProfileString(MINIP,minip,MinIp,)。 //最小 ip 写入配置文件 } } } else//如果是二次请求 { strcpy(,MaxIp)。 //分配给最大 ip if(!Write()) { MessageBox(NULL,Fail to write ipaddress to the queue! ,Error!,MB_OK)。 (Fail to write ipaddress to the queue! )。 continue。 } SubMaxip(MaxIp,MinIp)。 //最大 ip 减小并不记录进配置文件 } 发送应答模块 发送应答模块的主要功能是读取要发送的应答信息,将子网掩码,网关等信息封装进应答包并以广播的形式发送出去,在单独的线程中实现。 模块流程图如下: 第 15 页 共 20 页 图 5 发送 应答模块流程图 主要实现代码如下 : GetPrivateProfileString(NETMASK,mask,mask,sizeof(mask),)。 //从配置文件中读子网掩码 GetPrivateProfileString(NETGATE,gate,gate,sizeof(gate),I)。 //从配置文件中网关 setsockopt(sockSender,SOL_SOCKET,SO_BROADCAST,(char FAR *)amp。 opt,sizeof(opt))。 //设置为可以发送广播 =INADDR_BROADCAST。 //设置为广播地址 while(threadFlag) //线程结束标志位 开始初始化网络环境 , 读取配置信息判断队列中是否有发送信息将发送信息读取出来TF将子网掩码 ,网关等信息封装进应答包以广播形式发送出去 第 16 页 共 20 页 { if(Read()==false)//读取发送信息 { Sleep(100)。 continue。 } //封装应答包 strcpy(buf,pakhead)。 //包头 strcat(buf,)。 //原 IP 地址 strcat(buf,:)。 strcat(buf,)。 //分配的 IP 地址 strcat(buf,:)。 strcat(buf,mask)。 //子网掩码 strcat(buf,:)。 strcat(buf,gate)。 //网关 if(sendto(sockSender,buf,strlen(buf)+1,0,(SOCKADDR *)amp。 saClient,sizeof(SOCKADDR_IN))==SOCKET_ERROR)//发送 { MessageBox(NULL,send ipaddress fail,Error!,MB_OK)。 (send ipaddress fail)。 return false。 } 4 软件测试 测试地点:学生寝室 硬件环境 : 2 台计算机,小型交换机。 测试方法: ,另一台安装客户端通过小型交换机相连。 客户端 IP 信息,使其不在同一网段内。 ,启动客户端,察看客户端是否能得到正确IP 地址。 ,重新启动客户端,观察是否获得到相同 IP 地址。 IP 地址和客户端相同,重新启动客户端服务。 IP 地址。 第 17 页 共 20 页 测试用例: 表 2 系统测试用例 服务器网络信息 IP 地址: 子网掩码: 网关: 客户端网络信息 IP 地址: 子网 掩码: 网关: 服务器配置信息 IP 地址范围: ~~ 子网掩码: 网关: 客户端获得 IP 信息 IP 地址: 子网掩码: 网关: 修改后客户端网络信息 IP 地址: 子网掩码: 网关: 客户端重启后 IP 信息 IP 地址: 子网掩码: 网关: 更改后服务器网络信息 IP 地址: 子网掩码: 网关: 客户端获得可用 IP 信息 IP 地址: 子网掩码: 网关: 模块编程完结之后,对程序功能进行检测。 首先针对一个模块测试,由于有部分参数是需要从其它模块传递过来的,因此,先要把需要传递的参数付与固定的值,然后才继 续后续步骤。 模块测试时,检验模块每个功能是否都能正常使用,包括参数类型、参数大小、界面等是否符合规范。 还有检测程序内部的主执行通路是否都能按预定要求正常工作,能按正确输出,能运行稳定。 测试过程中,测试员要填写测试报告书。 测试报告书对每个模块的测试项目和测试结果进行了记录。 发现 BUG 时及时提出以便修正。 模块测试完后,先把在模块测试时固定了的需要。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。