实验6:基于MFC CAsyncSocket类的网络通信.docx

上传人:夺命阿水 文档编号:850407 上传时间:2023-12-27 格式:DOCX 页数:16 大小:295.51KB
返回 下载 相关 举报
实验6:基于MFC CAsyncSocket类的网络通信.docx_第1页
第1页 / 共16页
实验6:基于MFC CAsyncSocket类的网络通信.docx_第2页
第2页 / 共16页
实验6:基于MFC CAsyncSocket类的网络通信.docx_第3页
第3页 / 共16页
实验6:基于MFC CAsyncSocket类的网络通信.docx_第4页
第4页 / 共16页
实验6:基于MFC CAsyncSocket类的网络通信.docx_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《实验6:基于MFC CAsyncSocket类的网络通信.docx》由会员分享,可在线阅读,更多相关《实验6:基于MFC CAsyncSocket类的网络通信.docx(16页珍藏版)》请在课桌文档上搜索。

1、实验6:基于MFCCASylICSoCket类的网络通信1实验目的与要求令掌握MFC的CSocket类、CAsyncSocket类的用法。掌握使用CAsyncSocket类进行网络程序设计的工作流程。Q能运用CAsyncSocket类开发一个简单的网络聊天程序。2实验设备与实验环境令连接到互联网上的IBMPe机两台。令硬件要求:InteIPenIiUm5处理器、256MB以上内存,EIhemet网卡,网线若干。令软件要求:MSWindoWS2000/XP操作系统,TCP/IP协议,VisualC+6.0/.NET3实验内容与步骤3.1服务器的开发3.1.1工程的创建在VC6.0的环境中新建一个

2、名为ChatSeVer的基于对话框的工程,创建步骤如图1图4所示,并在创建过程的第2步中选中SOCkel选项(如图3所示)。在生成的工程中设置通信的端口号,木例设为5678,设置方法是在CChaISeVerDlg.h头文件的开始处定义一个宏,如下所示:#defineiPort5678SingledocumentCMultipledocumentsWhattypeofapplicationwouldyouliketocreate?JJJWhatlanguagewouldyoulikeyourresourcesIn?I中文冲国I(APPWZCHSQUj3finishCancel图23.1.2 界面

3、的设计将服务器程序的界面设计成如图5所示。图53.1.3 各控件的属性设置给各控件设置属性,如表1所示表1控件类型IDCaption说明按钮Idcancel取消退出程序按钮IDC_BTN_SER_OPEN打开服务器打开服务器并使之监听按钮IDC_BTN_SER_CLOSE关闭服务器将服务器关闭按钮IDC_BTN_DISCONNECT断开连接和客户端断开连接按钮1DC_BTN_MSG_SEND发送将编辑框中的文本发送到对方列表框IDC_LIST_MSG显示双方的对话记录文本编辑框IDC_EDIT_MSG输入需要发送的文本3.1.4 给控件映射变量给控件映射变量,具体如表2所示表2控件ID变量类属

4、Category变量类型Variabletype变量名MemberVariablenameIDC_LIST_MSGControlCListBoxmisi_msg1DC_EDIT_MSGValueCStringm_edit_msg具体的映射过程如下:(1)右键单击需映射变量的控件,在弹出的菜单中选中ClassWizard选项,如图6所示。(2) 在弹出的对话框的第二个标签页(MemberVariableS)中选中需映射变量的控件的ID,然后点击右侧的AddVariable按钮,如图7所示。(3) 在弹出的变量设置对话框中,选择变量类属、变量类型,输入变量名称,然后点击OK,如图8所示。S9WXX

5、gtHKiH0X必卜2JCChlScvefOfJDCJJSF1.hatSeverIDO_(HATSCVfR.DIMOG(DMM)ICJD制(Xh=SerOsJM.MSG*)LBN.SCLCHANGE三区.IEK*i1ydtjOnSendOnReCeiVe函数。图143.1.6 给CChatSeverDlg类添加成员变量和自定义成员函数一、添加变量我们在CChatSeverDlg类中添加变量:mJiStensocketm_worksocket,变量类型均为CMySocket,访问类型为PUbIic,mJistensocket变量(监听套接字)用于监听客户端的连接请求,m-worksocket变量

6、(通信套接字)用于和客户端进行数据接收和发送。添加过程如下:(1) 在类视图中右键单击CChatSeverDlg类,在弹出菜单中点击AddMemberVariable,如图15所示;(2) 在弹出的AddMemberVariable对话框的VariableType编辑框中输入CMySocket,在VariableName框中输入mistensockel,Access设置为public,如图16所示;(3) 重复(1)、(2)两步,添加mWOrkSoCket变量。j1Xa- |耽.|山.一|图16二、添加自定义成员函数为以后的与客户端的通信,我们给CChatSeVerDlg对话框类添加如下函数:

7、accept()、recv()SeCd()、connects、close(),函数类型均为VOid,添加过程如下:(4) 在类视图中右键单击CChatSeverDlg类,在弹出菜单中点击AddMemberFunction,如图17所示;(5) 在弹出的AddMemberFunction对话框的FunctionType编辑框中输入void,在FUnCtiOnName框中输入accept(),ACCeSS设置为PUbIic,如图18所示;(6) 重复、(2)两步,添加recv()、Send()、connect。、ClOSe()函数。图17以上函数中,accept()函数用于服务器接受客户端的连接请

8、求,connects用于客户端向服务器提出连接请求,Send()用于向对方发送数据,recv()用于接收对方发来的数据,close()用于关闭通信套接字终止连接。3.1.7 添加代码一、给CMySoCket类成员函数添加代码(1)在CMySocket:OnAccept(intnErrorCode)成员函数的/TODO:Addyourspecializedcodehereand/orcallthebaseclass后添加如下代码:if(nErrorCode=0)(CChatSeverDlg*p_Dlg;p_Dlg=(CChatSeverDlg*):AfxGetMainWnd();P-Dlg-ac

9、cept();)(2)在CMySocket:OnConnect(intnErrorCode)成员函数的/TODO:Addyourspecializedcodehereand/orcallthebaseclass后添加如下代码:if(nErrorCode=0)(CChatSeverDlg*p_Dlg;p_Dlg=(CChatSeverDlg*):AfxGetMainWnd();P-Dlg-connect();)(3)在CMySocket:OnReceive(intnErrorCode)成员函数的/TODO:Addyourspecializedcodehereand/orcallthebasecl

10、ass后添加如下代码:if(nErrorCode=0)(CChatSeverDlg*p_Dlg;p_Dlg=(CChatSeverDlg*):AfxGetMainWnd();p_Dlg-recv();)(4)在CMySOeket:OnClose(intnErrorCode)成员函数的TODO:Addyourspecializedcodehereand/orcallthebaseclass后添加如下代码:if(nErrorCode=0)(CChatSeverDlg*p_Dlg;p_Dlg=(CChatSeverDlg*):AfxGetMainWnd();P-Dlg-close();)二、给CCh

11、atSeverDIg类成员函数添加代码给CChatSeVerDIg类的自定义成员函数分别添加如下代码:voidCChatSeverDlg:accept()(structsockaddr_incli;intIen=sizeof(cli);CStringStrlpAddr;m_listensocket.Accept(m_worksocket,(SOCKADDR*)EnableWindow(false);GetDlgItem(IDC-BTN.MSG-SEND)-EnableWindow(true);GetDlgItem(IDC_BTN_DISCONNECT)-EnableWindow(true);v

12、oidCChatSeverDlg:close()(m_worksocket.Close();AfXMeSSageBOX(连接己经断开!,);GetDlgItem(IDC_BTN_SER_CLOSE)-EnableWindow(true);GetDlgItem(IDC_BTN_MSG_SEND)-EnableWindow(FALSE);GetDIgItem(IDCJBTNjDNCONNECT)AEnableWindow(FALSE);)voidCChatSeverDlg:send()(UpdateData(Irue);if(!m_edit_msg.IsEmptyO)(CStringmsg;CSt

13、ringfrom=自己:”;msg=from+m_edit_msg;intIen=m_edit_msg.GetLength();m_worksocket.Send(m_edit_msg,len);m_list_msg.InsertString(O,msg);m_edit_msg.Empty();UpdateData(false);voidCChatSeverDlg:recv()(charbuf1024;CStringmsg;CStringfrom=对方:”;intIen=m_worksocket.Receive(buf,1024);buflen=,0;msg=buf;msg=from+msg;

14、m_list_msg.InsertString(O,msg);)在CChatSeverDlg类的OnInitDiaIogo函数中的ToDO:Addextrainitializationhere后添加如下代码:GetDlgItem(IDC_BTN_SER_OPEN)-EnableWindow(true);GetDlgItem(IDC_BTN_SER_CLOSE)-EnableWindow(FALSE);GetDlgItem(IDC_BTN_DISCONNECT)-EnableWindow(FALSE);GetDlgItem(IDC_BTN_MSG_SEND)-EnableWindow(FALSE

15、);GetDlgItem(IDCANCEL)-EnableWindow(true);给CChatSeverDIg类的各个按钮的消息处理函数添加如下代码:voidCChatSeVerDIg=OnBtnSerOpenO(/TODO:AddyourcontrolnotificationhandlercodeheremJistensocket.Create(iPort);m_listensocket.Listen();GetDlgItem(IDC_BTN_SER_OPEN)-EnableWindow(false);GetDlgItem(IDC_BTN_SER_CLOSE)-EnableWindow(t

16、rue);GetDIgltem(IDCANCEL)-EnableWindow(FALSE);1voidCChatSeVerDIg=OnBlnSerCloseO(/TODO:Addyourcontrolnotificationhandlercodeherem_listensocket.Close();GetDlgItem(IDC_BTN_SER_OPEN)-EnableWindow(true);GetDlgItem(IDC_BTN_SER_CLOSE)-EnableWindow(FALSE);GetDlgItem(IDC_BTN_MSG_SEND)-EnableWindow(FALSE);Get

17、DlgItem(IDCANCEL)-EnableWindow(true);GetDlgItem(IDC_BTN_DISCONNECT)-EnableWindow(FALSE);voidCChatSeVerDlg=OnBtnDisconnectO(/TODO:Addyourcontrolnotificationhandlercodehereclose();)voidCChatSeVerDIg:QnBtnMsgSend()(/TODO:Addyourcontrolnotificationhandlercodeheresend();)3.2客户端的开发3.2.1 工程的创建创建一个名为ChatCIi

18、ent的基于对话框的MFC应用程序工程,创建过程同3.1.1,并定义通信端口iPort为5678(同3.1.1)。3.2.2 界面的设计将客户端界面设计成如图19所示。图193.2.3 设置控件的属性给各控件设置属性,如表3所示表3控件类型IDCaption说明按钮Idcancel关闭退出程序按钮IDC_BTN_CONNECT连接打开服务器并使之监听按钮IDC_BTN_DISCONNECT断开和客户端断开连接按钮IDC_BTN_MSG_SEND发送将编辑框中的文本发送到对方列表框1DC_LIST_MSG显示双方的对话记录静态文本服务器:文本编辑框IDC_EDIT_SEVER设置服务器地址文本编

19、辑框IDC_EDIT_MSG输入需要发送的文本3.2.4 给控件映射变量给控件映射变量,具体如表4所示表4控件ID变量类属Category变量类型Variabletype变量名MemberVariablenameIDC_LIST_MSGControlCListBoxm_list_msgIDC_EDIT_SEVERValueCStringm_edit_severIDC_EDIT_MSGValueCStringm_edit_msg3.2.5 添加派生类(同3.1.4)3.2.6 给CMySocket类添加重载虚拟函数(同3.1.5)3.2.7 给CChatClientDlg类添加成员变量和自定义成

20、员函数一、添加变量只添加变量m_worksocket,类型和添加过程均同3.1.6。二、添加自定义成员函数(同3.1.6)3.2.8 添加代码一、给CMySoCket类成员函数添加代码(同3.1.7)二、给CChatClientDlg类成员函数添加代码voidCChatClientDlg:connect()(AfXMeSSageBOX(连接成功!”);GetDlgItem(IDC_BTN_MSG_SEND)-EnableWindow(true);GetDlgItem(IDC_BTN_DISCONNECT)-EnableWindow(true);GetDlgItem(IDC_BTN_CONNEC

21、T)-EnableWindow(false);GetDlgItem(IDCANCEL)-EnableWindow(false);)voidCChatClientDlg:xlose()(m_worksocket.Close();AfXMeSSageBoX(连接已经断开!”);GetDlgItem(IDC_BTN_CONNECT)-EnableWindow(true);GetDlgItem(IDC_BTN_DISCONNECT)-EnableWindow(false);GetDlgItem(IDC_BTN_MSG_SEND)-EnableWindow(false);GetDlgItem(IDCAN

22、CEL)-EnableWindow(true);voidCChatClientDIg:recv()charbuf1024;CStringmsg;CStringfrom=对方:”;intIen=m_worksocket.Receive(buf,1024);buflen=,0;msg=buf;msg=from+msg;m_list_msg.InsertString(O,msg);)voidCChatClientDlg:send()(UpdateData(true);if(!m_edit_msg.IsEmptyO)1CStringmsg;CSlringfrom=自己:”;msg=from+m_edi

23、t_msg;intIen=m_edit_msg.GetLength();m_worksocket.Send(m_edit_msg,len);mJist_msg.InsertString(O,msg);)m_edit_msg.Empty();UpdateData(false);1在CChatClientDIg类的OilInitDiakg()函数中的TODO:Addextrainitializationhere后添加如下代码:GetDlgItem(IDC_BTN_CONNECT)-EnableWindow(true);GetDlgItem(IDC_BTN_DISCONNECT)-EnableWin

24、dow(false);GetDlgItem(IDC_BTN_MSG_SEND)-EnableWindow(false);GetDlgItem(IDCANCEL)-EnableWindow(true);给CChatSeverDIg类的各个按钮的消息处理函数添加如下代码:voidCChatClientDlg:OnBtnConnect()/TODO:AddyourcontrolnotificationhandlercodehereUpdateDataO;if(!m_edit_sever.lsEmpty()(m_worksocket.Create();m_worksocket.Connect(m_ed

25、it_sever,iPort);GetDlgItem(IDC_BTN_CONNECT)-EnableWindow(false);)m_edit_sever.Empty();)voidCChatClientDlg:OnBtnDisconnect()(/TODO:Addyourcontrolnotificationhandlercodehereclose();)voidCChatClientDlg:OnBtnMsgSend()(/TODO:Addyourcontrolnotificationhandlercodeheresend();)4程序调试、试运行5从本机扩展到网络运行在本机将客户端服务器端程序调试好后,在局域网中利用两台机器,将服务器端和客户端程序分别放在两台机器上,试运行。6实验报告本次交实验报告,内容包括:实验目的与要求;2实验设备与实验环境;3实验内容与实验步骤(实验步骤、源代码);4实验心得(可以是实验总结、难点讨论、意见建议等)。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号