网络协议编程课程设计.docx
《网络协议编程课程设计.docx》由会员分享,可在线阅读,更多相关《网络协议编程课程设计.docx(11页珍藏版)》请在冰点文库上搜索。
网络协议编程课程设计
HUNANCITYUNIVERSITY
网络协议编程课程设计
说明书
设计题目:
基于MFC框架的Echo协议模拟软件的设计与实现
专业:
网络工程
学生姓名:
*****
班级学号:
1206101-28
分组成员:
1206101-05*****、1206101-31******
1206101-28何***
指导教师:
****老师*****老师
2015年07月03日
《网络协议编程课程设计》说明书
学号:
1206101-28姓名:
****
一、设计时间
2015年06月29日-----07月03日。
二、设计地点
湖南城市学院信息楼507机房。
三、设计目的
1、巩固《网络协议编程》课程涉及的基本知识,培养灵活运用知识进行独立设计的能力;
2、掌握TCP/IP网络程序框架、WinsockAPI、高级网络编程API的使用;
3、提高综合运用所学的理论知识独立分析和解决问题的能力;
4、进一步熟悉利用VisualC++6.0进行开发的能力;
5、培养查阅资料,独立思考问题的能力。
四、设计小组成员
1206101-05****1206101-31****1206101-28****
五、指导老师
****老师、****老师。
六、设计课题
经过小组组员的讨论,决定选取选题(18基于MFC框架的Echo协议模拟软件的设计与实现),编写一个基于MFC框架的Echo协议模拟软件。
理由:
1、Echo协议(也称回声协议)是一个非常简单的协议,它主要用于网络可达性的检测中。
2、该系统功能相对简单,易于实现,适于初学者。
3、该系统牵涉到TCP协议、CAsysncSocket类、C/S模式以及MFC框架,采用VC6.0编制程序模拟Echo协议的基本功能,需要灵活运用这些知识解决实际问题,有利于培养网络系统开发的实际动手能力。
七、基本思路及关键问题的解决方法
本系统的开发采用基于MFC的Echo协议的C/S模式,服务器在端口7检测接收到的信息,如果收到信息,则原封不动地重发回客户端。
根据C/S模式的特点,使用TCP协议、CAsysncSocket类、C/S模式以及MFC框架,采用VC6.0编制程序模拟Echo协议的基本功能。
设计为了方便,利用VC++自动生成的对话框来进行删除和修改,并且利用图形用户界面来添加相应的相应按钮。
8、算法及流程图
9、程序运行:
服务器初始界面:
客户端初始界面:
服务器开始侦听,客户端点击连接:
弹出如下对话框,输入相应信息:
客户端点击确定后服务器弹出如下提示框:
在信息输入框输入信息:
点击发送:
发送成功并接收到了从服务器端返回的一样的信息。
10、调试过程中出现的问题及相应解决办法
1.调试过程中出现问题,一一对应检查,在经过对书上代码的对比后改正,最终成功编译并运行。
2.在连接时使用了不相同的端口号,导致建立不了连接,检查之后发现并改正过来。
3.在画流程图时,由于对代码的不熟悉,导致问题多多,经慢慢了解,初步得以解决。
十一、课程设计心得体会
通过这次课程设计,让我更加深刻的了解了TCP这门课程编程方面的知识,和以往对知识的疏忽也得以补充,在设计过程中,我和小组另一位成员一起负责画流程图和基本思路方面,虽然遇到了一些问题,但经过我们几个同学的一次又一次的思考,一遍又一遍的检查终于找出了原因并及时改正,虽然我们在这方面的知识有所欠缺和不足,但是我觉得我收获了很多、学会了很多、也比以往更有耐心很多。
十二、源程序
服务器:
//侦听
voidCCSockServerDlg:
:
OnListen()
{
if(m_srvrSocket.m_hSocket==INVALID_SOCKET)
{
BOOLbFlag=m_srvrSocket.Create(7,SOCK_STREAM,FD_ACCEPT);
if(!
bFlag)
{
AfxMessageBox("SocketError!
");
m_srvrSocket.Close();
PostQuitMessage(0);
return;
}
}
//"侦听"成功,等待连接请求
if(!
m_srvrSocket.Listen
(1))
{
intnErrorCode=m_srvrSocket.GetLastError();
if(nErrorCode!
=WSAEWOULDBLOCK)
{
AfxMessageBox("SocketError!
");
m_srvrSocket.Close();
PostQuitMessage(0);
return;
}
}
客户端:
//连接
voidCCSockClientDlg:
:
OnConnect()
{
m_clientSocket.ShutDown
(2);
m_clientSocket.m_hSocket=INVALID_SOCKET;
m_clientSocket.m_bConnected=FALSE;
CAddrDlgm_Dlg;
//默认端口7
m_Dlg.m_Port=7;
if(m_Dlg.DoModal()==IDOK&&!
m_Dlg.m_Addr.IsEmpty())
{
memset(m_szServerAdr,0,sizeof(m_szServerAdr));//汪彦老师添加
//memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_Dlg.m_Addr));
memcpy(m_szServerAdr,m_Dlg.m_Addr,strlen(m_Dlg.m_Addr)+1);
m_szPort=m_Dlg.m_Port;
//建立计时器,每1s尝试连接一次,直到连上或TryCout>10
SetTimer(1,1000,NULL);
TryCount=0;
}
}
//发送
voidCCSockClientDlg:
:
OnSend()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(m_clientSocket.m_bConnected)
{
m_clientSocket.m_nLength=m_MSG.GetWindowText(m_clientSocket.m_szBuffer,sizeof(m_clientSocket.m_szBuffer));
m_clientSocket.AsyncSelect(FD_WRITE);
m_MSG.SetWindowText("");
}
}
//退出
voidCCSockClientDlg:
:
OnExit()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//关闭socket
m_clientSocket.ShutDown
(2);
//关闭对话框
EndDialog(0);
}
//WINDOWS消息响应函数
voidCCSockClientDlg:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
if(m_clientSocket.m_hSocket==INVALID_SOCKET)
{
BOOLbFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT);
if(!
bFlag)
{
AfxMessageBox("SocketError!
");
m_clientSocket.Close();
PostQuitMessage(0);
return;
}
}
//AfxMessageBox(m_szServerAdr);
m_clientSocket.Connect(m_szServerAdr,m_szPort);//汪彦老师修改
//m_clientSocket.Connect("127.0.0.1",7);
TryCount++;
if(TryCount>=10||m_clientSocket.m_bConnected)
{
KillTimer
(1);
if(TryCount>=10)
{
AfxMessageBox("ConnectFailed!
");
return;
}
}
CDialog:
:
OnTimer(nIDEvent);
}
参考文献
[1]任泰明.TCP/IP网络编程[M].北京:
人民邮电出版社,2009.
[2]叶树华.网络编程实用教程[M].北京:
人名邮电出版社,2010.
[3]冯博琴,宋坤,刘锐宁.VisualC++大学教程[M].北京:
人民邮电大学出版社,2008.
[4]宋坤,刘锐宁.VisualC++开发典型模块大全[M].北京:
人民邮电大学出版社,2009.