《网络协议编程》实验报告单基于winsockAPI函数的MFC网络应用程序分析.doc

上传人:土8路 文档编号:10301358 上传时间:2021-05-06 格式:DOC 页数:11 大小:117KB
返回 下载 相关 举报
《网络协议编程》实验报告单基于winsockAPI函数的MFC网络应用程序分析.doc_第1页
第1页 / 共11页
《网络协议编程》实验报告单基于winsockAPI函数的MFC网络应用程序分析.doc_第2页
第2页 / 共11页
《网络协议编程》实验报告单基于winsockAPI函数的MFC网络应用程序分析.doc_第3页
第3页 / 共11页
《网络协议编程》实验报告单基于winsockAPI函数的MFC网络应用程序分析.doc_第4页
第4页 / 共11页
《网络协议编程》实验报告单基于winsockAPI函数的MFC网络应用程序分析.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《《网络协议编程》实验报告单基于winsockAPI函数的MFC网络应用程序分析.doc》由会员分享,可在线阅读,更多相关《《网络协议编程》实验报告单基于winsockAPI函数的MFC网络应用程序分析.doc(11页珍藏版)》请在三一文库上搜索。

1、实验一报告单班 级_0906101_ 姓 名_贺嵘 _ 学 号_08_ 实验日期_ 评 分_ 教师签名_ 1实验名称基于winsock API与MFC的网络程序的编写与分析。2实验目的(1)进一步熟练掌握常用的WinSock API函数。(2)掌握基于MFC的简单应用程序的编写方法,理解VC编写的Windows应用程序的运行机制。(3)掌握基于WinSock API函数与MFC的网络通信程序的编写方法。3实验地点 一实验楼510机房4实验环境计算机局域网、Visual C+6.05实验性质实验性质:验证性。6实验学时实验课时:2学时。7实验内容(1)基于WinSock API函数和UDP协议的

2、网络通信MFC程序的界面制作。(2)基于WinSock API函数和UDP协议的网络聊天MFC程序的代码编写。(3)聊天程序在局域网中两台不同电脑上的测试。(4)聊天程序在同一台电脑上的测试。(5)聊天程序核心代码分析说明。8实验步骤(1)基于WinSock API函数和UDP协议的网络通信MFC程序的界面制作。在Visual C+6.0中,利用MFC AppWizardexe新建一个工程,自拟工程名称,并注意设置该工程的保存位置(如图1所示),选择应用程序类型为“基本对话框”(如图2所示,并注意选中WOSA支持(如图3所示),其余采用默认。 图1 图2图3在得到的工程的对话框资源上,放置两个

3、文本控件,两个命令按钮,一个框架控件并修改各控件的属性和布局如图4所示。 图4(2)基于WinSock API函数和UDP协议的网络聊天MFC程序的代码编写。WyChat.h的主要代码如下:class CWyChatApp : public CWinApppublic:CWyChatApp(); CWyChatApp(); /添加的析构函数,便于WinSock函数库的注销/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CWyChatApp)public:virtual BOOL InitInst

4、ance();/AFX_VIRTUAL/ Implementation/AFX_MSG(CWyChatApp)/ NOTE - the ClassWizard will add and remove member functions here./ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP();WyChat.cpp的主要代码如下:CWyChatApp:CWyChatApp() /析构函数 WSACleanup(); /注销WinSock函数库/ The one a

5、nd only CWyChatApp objectCWyChatApp theApp;/ CWyChatApp initializationBOOL CWyChatApp:InitInstance() /在初始化函数中注册WinSock函数库/if (!AfxSocketInit()/AfxMessageBox(IDP_SOCKETS_INIT_FAILED);/return FALSE;/ WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup(

6、wVersionRequested, &wsaData );if ( err != 0 ) return FALSE;if ( LOBYTE( wsaData.wVersion ) != 2 | HIBYTE( wsaData.wVersion ) != 2 ) WSACleanup( );return FALSE; AfxEnableControlContainer();WyChatDlg.h的主要代码如下:#define MSG_SOCK WM_USER+1 /自行定义的WinSock套接字消息编号/ CWyChatDlg dialogclass CWyChatDlg : public C

7、Dialog/ Constructionpublic:CWyChatDlg(CWnd* pParent = NULL);/ standard constructor CWyChatDlg(); /自行添加的对话框析构函数/ Dialog Data/AFX_DATA(CWyChatDlg)enum IDD = IDD_WYCHAT_DIALOG ;/ NOTE: the ClassWizard will add data members here/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CWyC

8、hatDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;/ Generated message map functions/AFX_MSG(CWyChatDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCU

9、RSOR OnQueryDragIcon();afx_msg void OnSend();/AFX_MSG afx_msg void OnSock(WPARAM,LPARAM); /自行添加的套接字响应函数DECLARE_MESSAGE_MAP()private:SOCKET m_socket; /自行定义的私有套接字成员变量public:BOOL InitSocket(); /自行定义的套接字初始化函数;WyChatDlg.cpp的主要代码如下:CWyChatDlg:CWyChatDlg() /自行添加的析构函数 if(m_socket)closesocket(m_socket); /关闭套

10、接字BEGIN_MESSAGE_MAP(CWyChatDlg, CDialog)/AFX_MSG_MAP(CWyChatDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDSEND, OnSend)/AFX_MSG_MAP ON_MESSAGE(MSG_SOCK,OnSock) /自行添加的消息关联END_MESSAGE_MAP()/ CWyChatDlg message handlersBOOL CWyChatDlg:OnInitDialog()CDialog:OnInitDialog();/ Add

11、 About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatica

12、lly/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization hereInitSocket(); /自行添加的套接字初始化函数调用return TRUE; / return TRUE unless you set the focus to a controlBOOL CWyChatDlg:InitSocket() m_socket=

13、socket(AF_INET,SOCK_DGRAM,0); if(INVALID_SOCKET=m_socket) int a=WSAGetLastError(); CString str; str.Format(%d,a); MessageBox(str); return FALSE; SOCKADDR_IN addrSock; addrSock.sin_addr.S_un .S_addr =inet_addr(127.0.0.1); addrSock.sin_family =AF_INET; addrSock.sin_port =htons(5003); if(bind(m_socket,

14、(SOCKADDR*)&addrSock,sizeof(SOCKADDR)=SOCKET_ERROR) / AfxMessageBox(_T(bind failed!); int a=WSAGetLastError(); CString str; str.Format(bind=%d,a); AfxMessageBox(str); return FALSE; if(WSAAsyncSelect(m_socket,m_hWnd,MSG_SOCK,FD_READ|FD_WRITE)=SOCKET_ERROR) AfxMessageBox(_T(register read event of net

15、failed!); return FALSE; return TRUE;void CWyChatDlg:OnSock(WPARAM wParam,LPARAM lParam) switch(LOWORD(lParam)case FD_READ:char buff254; sockaddr_in addr2; int n=sizeof(addr2); long charNum=0; CString strFileLen=; charNum=:recvfrom(m_socket,buff,sizeof(buff),0,(sockaddr*)&addr2,&n); buffcharNum=0; /在

16、接收缓冲区实际接收到的字符串尾部加上结束标志CString strTemp; GetDlgItemText(IDC_EDITChat,strTemp);strTemp=strTemp+rn+对方说:+buff; /SetDlgItemText(IDC_EDITChat,buff); SetDlgItemText(IDC_EDITChat,strTemp); UpdateData(false);break; case FD_WRITE: default: break;/ The system calls this to obtain the cursor to display while the

17、 user drags/ the minimized window.HCURSOR CWyChatDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CWyChatDlg:OnSend() / TODO: Add your control notification handler code here CString strSend; GetDlgItemText(IDC_EDIT_Send,strSend);sockaddr_in addr,addr2;int n=sizeof(addr2);char buff10=0;addr.sin_fam

18、ily=AF_INET;addr.sin_port=htons(7600); /设置对方的端口号 addr.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);/设置对方的IP/*int n1=strSend.GetLength();CString msg;msg.Format(%d,n1); MessageBox(msg);*/ if(strSend.GetLength()!=0) :sendto(m_socket,strSend,strSend.GetLength(),0,(sockaddr*)&addr,n); CString strTemp; CStri

19、ng myChat; GetDlgItemText(IDC_EDITChat,strTemp); GetDlgItemText(IDC_EDIT_Send,myChat); strTemp=strTemp+rn+你说:+myChat; /SetDlgItemText(IDC_EDITChat,buff); SetDlgItemText(IDC_EDITChat,strTemp); SetDlgItemText(IDC_EDIT_Send,); else AfxMessageBox(_T(不能发送空消息!);(3)聊天程序在局域网中两台不同电脑上的测试。每两个同学(称为甲乙)为一小组,分别在两台

20、不同的电脑上编写程序,注意双方本机与远程机IP地址、端口号的正确设定。若程序编写好后,双方均启动程序,验证并观察双方的通信反馈信息,进行即时的点到点的在线聊天。在甲同学编写的WyChatDlg.cpp文件中的BOOL CWyChatDlg:InitSocket()函数中,有如下代码:SOCKADDR_IN addrSock; addrSock.sin_addr.S_un .S_addr =inet_addr(127.0.0.1); addrSock.sin_family =AF_INET; addrSock.sin_port =htons(5003);上述代码是用于设定本机中套接字的本地端口的

21、。在甲同学编写的WyChatDlg.cpp文件中的void CWyChatDlg:OnSend()函数中,有如下代码:addr.sin_family=AF_INET;addr.sin_port=htons(7600); /设置对方的端口号 addr.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);/设置对方的IP上述代码是用于设定对方的主机IP以及对应套接字的端口号码的。注意上述端口中一个为5003,一个为7600,注意乙同学的程序代码中,应该讲这两个端口号码交换过来。(4)聊天程序在同一台电脑上的测试。验证通过后,请每位同学在单机上调试验证,注意此时远程机IP为本机地址,即“127.0.0.1”。(5)聊天程序核心代码分析说明。9实验思考(1)若在聊天时,每个人都可设置自己的昵称,并可将该昵称发送给对方,程序应该如何修改?(2)若在一台电脑上调试程序,同时运行两个程序实例会出现错误吗?为什么会出现这样的错误?如何修改程序才能避免这样的错误呢?(3)实验中碰到一些什么样的其他问题?你是如何解决的?10实验心得

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1