HUNAN CITY UNIVERSITY
网络协议编程课程设计
说明书
设计题目:基于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网络程序框架、Winsock API、高级网络编程API的使用;
3、提高综合运用所学的理论知识独立分析和解决问题的能力;
4、进一步熟悉利用Visual C++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++自动生成的对话框来进行删除和修改,并且利用图形用户界面来添加相应的相应按钮。
八、算法及流程图
九、程序运行:
服务器初始界面:
客户端初始界面:
开始
初始化
加载
CAsyncSocket类
结束
连接失败接收数据
建立连接
N
响应函数OnTimer()
客户端流程图
Y
关闭
客户端点击确定后服务器弹出如下提示框:服务器开始侦听,客户端点击连接:
弹出如下对话框,输入相应信息:
点击发送:
发送成功并接收到了从服务器端返回的一样的信息。
十、调试过程中出现的问题及相应解决办法
1.调试过程中出现问题,一一对应检查,在经过对书上代码的对比后改正,最终成功编
译并运行。
2.在连接时使用了不相同的端口号,导致建立不了连接,检查之后发现并改正过来。
3.在画流程图时,由于对代码的不熟悉,导致问题多多,经慢慢了解,初步得以解决。十一、课程设计心得体会
通过这次课程设计,让我更加深刻的了解了TCP这门课程编程方面的知识,和以往对知识的疏忽也得以补充,在设计过程中,我和小组另一位成员一起负责画流程图和基本思路方面,虽然遇到了一些问题,但经过我们几个同学的一次又一次的思考,一遍又一遍的检查终于找出了原因并及时改正,虽然我们在这方面的知识有所欠缺和不足,但是我觉得我收获了很多、学会了很多、也比以往更有耐心很多。
十二、源程序
服务器:
//侦听
void CCSockServerDlg::OnListen()
{
if(m_srvrSocket.m_hSocket==INVALID_SOCKET)
{
BOOL bFlag=m_srvrSocket.Create(7,SOCK_STREAM,FD_ACCEPT);
if(!bFlag)
{
AfxMessageBox("Socket Error!");
m_srvrSocket.Close();
PostQuitMessage(0);
return;
}
}
//"侦听"成功,等待连接请求
if(!m_srvrSocket.Listen(1))
{
int nErrorCode=m_srvrSocket.GetLastError();
if(nErrorCode!=WSAEWOULDBLOCK)
{
AfxMessageBox("Socket Error!");
m_srvrSocket.Close();
PostQuitMessage(0);
return;
}
}
客户端:
//连接
void CCSockClientDlg::OnConnect()
{
m_clientSocket.ShutDown(2);
m_clientSocket.m_hSocket=INVALID_SOCKET;
m_clientSocket.m_bConnected=FALSE;
CAddrDlg m_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;
}
}
//发送
void CCSockClientDlg::OnSend()
{
// TODO: Add your control notification handler code here
if(m_clientSocket.m_bConnected)
{
m_clientSocket.m_nLength=m_MSG.GetWindowText(m_clientSocket.m_szBuffer,sizeof(m