计算机网络课设设计报告-VS2013-MFC基于对话框编程_第1页
计算机网络课设设计报告-VS2013-MFC基于对话框编程_第2页
计算机网络课设设计报告-VS2013-MFC基于对话框编程_第3页
计算机网络课设设计报告-VS2013-MFC基于对话框编程_第4页
计算机网络课设设计报告-VS2013-MFC基于对话框编程_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I成绩:2015-2016学年第2学期《计算机网络》课程设计题目:多终端数据采集系统的设计与实现学院名称:班级学号:学生姓名:教师姓名:2016年7月一、实验要求(1)按照所给出的通信协议格式,利用UDP通信,实现多终端数据采集并显示【必做项】;(2)进一步可以在服务器中各终端上传数据进行数据库保存,在此基础上开发基于网页或手机APP的多终端数据实时监控;【选做项】(3)根据自己所设计实现的任务,完成课程设计报告。二、终端与服务器之间通信协议(1)帧格式(固定部分13B+数据部分[帧长])信息头2B版本号1B帧长2B类型1B帧号1B数据校验和4B结束标志2B0xFFFFCRC320xFFF7其中:帧号,取值范围1~255;一般一种命令包组织成一个帧,也可以称其为逻辑帧,内容强调其逻辑上的完整性。版本号,1字节,缺省为0.帧长:为每个物理帧的数据部分长度,即有效位长度,整个帧长-13(固定部分长度),一般其取值为0~490。2字节。类型:保留,缺省值1。校验和:CRC32校验,只是对版本号到数据部分的字节内容加校验,即信息头和结束标志部分不在校验之列,校验算法见本文档最后部分。命令帧(即帧的数据部分)终端ID5B命令1B数据其中:终端ID:5个字节的BCD编号。命令:小于128,大于128为异常命令,即异常命令=0x80+命令。(3)终端与服务器之间通信流程终端上传数据包给服务器,服务器接收,发送确认包给终端终端->服务器命令序号数据包类型序号数据包类型命令码1B说明1数据上传数据包0x13网络其中数据上传数据包格式如下命令码1B上传记录数1B上传数据0x13n[1~10]按时间升序排列的采集状态数据42*n所上传的42字节状态数据的组织结构表名称类型字节数备注1采集时间byte6YYMMDDhhmmss2经度字节数组51字节符号位(0正1负)+1字节整数+3字节小数(BCD编码),东经正数,西经为负数3纬度字节数组51字节符号位(0正1负)+1字节整数+3字节小数(BCD编码)4水温字节数组4Real,缺省值05PH值字节数组4Real,缺省值06电导率字节数组4Real,缺省值07浊度字节数组4Real,缺省值08溶解氧字节数组4Real,缺省值09氨氮字节数组4Real,缺省值010上传标志byte10:未上传,1:已上传,缺省011故障代码byte1位号:0:Modbus故障,1:上传故障,2:连接管理服务器故障,3:位移报警,4:停电故障,5:系统故障。42服务器->终端命令列表序号数据包类型序号数据包类型命令码1B说明1确认包0x13网络其中确认包格式如下命令码1B帧号1B发送方时间7B0x13被确认的帧号YYYYMMDDhhmmss(BCD码)终端与服务器通信过程的说明:终端每隔一定时间(默认为10秒)发送一个数据上传包,服务器收到数据上传包后,返回确认包;服务器在规定的数据上传等待计时长度时间内(默认为1分钟)没有收到终端的任何信息,则认为该终端不在线(即离线)。如果终端在规定的时间内(默认为5秒)没有收到服务器确认包,则重发该上传数据包,每个上传数据包最多重发一次,还是没收到确认的话则丢去,延时30秒再发送下一个上传数据包。终端与服务器通信采用UDP方式。数据帧校验和计算方法三、实现方案新建两个基于对话框的工程,分别为服务器、客户端。服务器端界面设计在服务器端添加两个Edit:一个显示窗口IDC_EDIT1(点击右键选择Properties->Styles,选中Multiline,Verticalscroll、Read-only三项),一个输入窗口IDC_EDIT2。然后增加一个发送按钮:IDC_BtnSend,名称为发送。客户端界面设计在客户端端添加三个Edit:一个显示窗口IDC_EDIT1(点击右键选择Properties->Styles,选中Multiline,Verticalscroll、Read-only三项),一个输入窗口IDC_EDIT2,一个IP地址输入窗口IDC_EDIT3。再增加两个按钮:一个发送按钮IDC_SEND,名称为发送,一个连接服务器按钮IDC_btnConnect,名称为连接服务器。代码实现(见附录1)四、测试结果正常接收状态关闭服务器后五、总结与展望这次课程设计和之前大不相同,很多知识都是第一次接触,例如MFC、SOCKET网络编程等等。一开始无从下手,只能先从网络上学习这些知识,而时间又比较紧迫,所以起初进度缓慢。待得初步熟悉了这些新知识以后,回过来再看这次课设就不再是那么迷茫了,有了一个大概的思路之后,设计也进入了正轨,从对话框设计再到服务器端客户端设计,虽然过程不是一帆风顺,但也是逐步推进。大体设计结束之后,进行调试,错误百出,由于学习得不是很深入,很多错误改起来也很棘手,尤其是各类数据类型之间的转换错误特别的多,百度、请教,各种尝试,花费了很长一段时间才把程序修改成功。初次调试,虽然没有语法上的错误,但因为逻辑错误,两端无法连接,初次调试以失败告终。不得不返回程序继续去修改。主要的错误是两端的IP地址不同,以及接收发送字符串长度有错。经过多次调试,程序最终成功了。对于这个设计,也有一些不足,服务器和客户端与现实中的功能有所差异,多客户端与服务器发送消息之间存在问题,还有待改进。总的而言,这次计算机网络课设收获颇丰,知识上学到了网络编程,学会如何设计一个简单的服务器端和客户端实现两端通信。以后踏入社会岗位最重要的是一个人的自学能力,尤其计算机这个行业技术日新月异,是离不开不断地学习的,这次的课设就完美地锻炼了我们的自学和动手能力,对于未来的就业和科研都有着重大意义。附录1(只附上添加的代码,自动生成的不在其内)服务器端:在stdafx.h中添加#include<afxsock.h>

//MFCsocketextensions

在服务器Dlg.h中添加public:voidupdate(CStrings);

在服务器Dlg.h中添加private:CEdit*show_edit;CEdit*send_edit;

2、在服务器Dlg.cpp中添加#include<winsock2.h>(加在#include"stdafx.h"之前)#include"tchar.h"

#pragmacomment(lib,"WS2_32.lib")

新建两个socket:SOCKETlisten_sock;SOCKETsock;

声明线程函数

UINTserver_thd(LPVOIDp);3、在OnInitDialog()函数中添加:

show_edit=(CEdit*)GetDlgItem(IDC_EDIT1); send_edit=(CEdit*)GetDlgItem(IDC_EDIT2); send_edit->SetFocus(); charname[80]; CStringIP; hostent*pHost; gethostname(name,128);//获得主机名 pHost=gethostbyname(name);//获得主机结构 IP=inet_ntoa(*(in_addr*)pHost->h_addr); update("本机IP地址:"+IP); AfxBeginThread(&server_thd,0); returnTRUE;//除非将焦点设置到控件,否则返回TRUE//添加函数update()voidC服务器Dlg::update(CStrings){ show_edit->ReplaceSel(s+"\r\n");}//添加线程函数server_thd()UINTserver_thd(LPVOIDp){ WSADATAwsaData; WORDwVersion; wVersion=MAKEWORD(2,2); WSAStartup(wVersion,&wsaData); //WSAStartup(0x0202,&wsaData); SOCKADDR_INlocal_addr; SOCKADDR_INclient_addr; intiaddrSize=sizeof(SOCKADDR_IN); intres; charmsg[1024]; C服务器Dlg*dlg=(C服务器Dlg*)AfxGetApp()->GetMainWnd(); local_addr.sin_family=AF_INET; local_addr.sin_port=htons(5150); local_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //local_addr.sin_addr.s_addr=htonl(INADDR_ANY); if((listen_sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET) { dlg->update("创建监听失败"); } if(bind(listen_sock,(structsockaddr*)&local_addr,sizeof(SOCKADDR_IN))) { dlg->update("绑定错误"); } listen(listen_sock,1); if((sock=accept(listen_sock,(structsockaddr*)&client_addr,&iaddrSize))==INVALID_SOCKET) { dlg->update("accept失败"); } else { CStringport; port.Format(_T("%d"),int(ntohs(client_addr.sin_port))); dlg->update("已连接来自:"+CString(inet_ntoa(client_addr.sin_addr))+"端口:"+port); } //接收数据 CStringstrRecv; while(1) { if((res=recv(sock,msg,1024,0))==-1) { dlg->update("失去连接"); break; } else { msg[res]='\0'; strRecv.Format(_T("client:%s"),msg); dlg->update(strRecv); } } return0;}添加按钮实现函数voidC服务器Dlg::OnBnClickedBtnsend()://发送按钮voidC服务器Dlg::OnBnClickedBtnsend(){ //TODO:在此添加控件通知处理程序代码 CStrings; send_edit->GetWindowText(s); //char*msg; //msg=(char*)s.GetBuffer(s.GetLength()); if(send(sock,(constchar*)s.GetBuffer(),(s.GetLength()+1)*2,0)==SOCKET_ERROR) { show_edit->ReplaceSel(_T("发送失败\r\n")); } elseif(s=="") { MessageBox(_T("请输入信息")); } else { show_edit->ReplaceSel("server:"+s+"\r\n");//消息上屏 send_edit->SetWindowText(_T(""));//清空输入 send_edit->SetFocus();//重获焦点 }}客户端:1、在stdafx.h中添加#include<afxsock.h>

//MFCsocketextensions

在客户端Dlg.h中添加public:voidupdate(CStrings);

在客户端Dlg.h中添加private:CEdit*edit1;CButton*btnconn; CEdit*send_edit;CEdit*ip_edit;

2、在客户端Dlg.cpp中添加#include<winsock2.h>(加在#include"stdafx.h"之前)#include"tchar.h"

#pragmacomment(lib,"WS2_32.lib")

新建两个socket:SOCKETsock;

声明线程函数

UINTrecv_thd(LPVOIDp);在OnInitDialog()函数中添加:edit1=(CEdit*)GetDlgItem(IDC_EDIT1);send_edit=(CEdit*)GetDlgItem(IDC_EDIT2);btnconn=(CButton*)GetDlgItem(IDC_btnConnect);ip_edit=(CEdit*)GetDlgItem(IDC_EDIT3);ip_edit->SetWindowText(_T("127.0.0.1"));//添加函数update()voidC客户端Dlg::update(CStrings){ edit1->ReplaceSel(s+"\r\n");}//添加线程函数recv_thd()UINTrecv_thd(LPVOIDp){ intres; charmsg[1024]; CStrings,strRecv; C客户端Dlg*dlg=(C客户端Dlg*)AfxGetApp()->GetMainWnd(); while(1) { if((res=recv(sock,msg,1024,0))==-1) { dlg->update("失去连接"); break; } else { msg[res]='\0'; strRecv.Format(_T("serve:%s"),msg); dlg->update(strRecv); } } //closesocket(sock); return0;}添加按钮实现函数voidC客户端Dlg::OnBnClickedSend()://发送按钮voidC客户端Dlg::OnBnClickedSend(){ //TODO:在此添加控件通知处理程序代码 intn; CStrings; send_edit->GetWindowText(s); if(send(sock,(constchar*)s.GetBuffer(),(s.GetLength()+1)*2,0)==SOCKET_ERROR) { update("发送失败"); } elseif(s=="") { MessageBox(_T("请输入信息")); } else { update("client:"+s);//消息上屏,清空输入,并重获焦点 send_edit->SetWindowText(_T("")); send_edit->SetFocus(); }}5、添加连接按钮实现函数OnBnClickedbtnconnect()://连接到服务器voidC客

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论