网络编程实验报告.doc_第1页
网络编程实验报告.doc_第2页
网络编程实验报告.doc_第3页
网络编程实验报告.doc_第4页
网络编程实验报告.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

实验一 TCP Socket API程序设计1、 预备知识1. 网络编程基本概念网络上的计算机间的通讯,实质上是网络中不同主机上的程序之间的通讯。在互联网中使用IP地址来标识不同的主机,在网络协议中使用端口号来标识主机上不同进程,即使用(IP地址,端口号)二元组。套接字(Socket)用于描述IP地址和端口,是一个通信链的句柄,通信时一个网络程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡相连的传输介质将这段信息发送到另一台主机的Socket中,以供其他程序使用。 图1-1 TCP通信流程2. TCP通信流程TCP程序是面向连接的,程序运行后,服务器一直处于监听状态,客户端与服务器通信之前必须首先发起连接请求,由服务器接收请求并在双方之间建立连接后才可以互相通信。2、 实验目的1. 了解Winsock API编程原理;2. 掌握TCP Socket程序的编写;3. 了解C/S模式的特点;4. 学会解决实验中遇到的问题。3、 实验任务使用Winsock API相关类实现TCP Socket通信程序,并能成功运行。4、 实验环境及工具1. Windows2000/XP/72. Visual C+开发平台3. Visual Studio20105、 实验内容和步骤参照Visual C+网络编程教程书中81页,TCP Socket API程序设计。连接:void CChatClientDlg:OnConnect() WSADATA wsd; /WSADATA结构 WSAStartup(MAKEWORD(2,2),&wsd);/加载协议,使用Winsock 2.2版 m_client = socket(AF_INET,SOCK_STREAM,0);/创建流式套接字 /服务器地址 sockaddr_in serveraddr; UpdateData(); if(ServerIP.IsBlank() AfxMessageBox(请指定服务器IP!); return; if(sPort.IsEmpty() AfxMessageBox(请指定端口!); return; /获取服务器进程的IP和端口 BYTE nFild4; CString sIP; ServerIP.GetAddress(nFild0,nFild1,nFild2,nFild3); sIP.Format(%d.%d.%d.%d,nFild0,nFild1,nFild2,nFild3); /设置服务器地址结构的内容 serveraddr.sin_family = AF_INET; serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP); serveraddr.sin_port = htons(atoi(sPort); /发起连接须指明要访问的服务器进程地址,这个地址存储在serveraddr中 if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr) != 0) MessageBox(连接失败); return; else m_ListWords.AddString(连接服务器成功!); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); WSAAsyncSelect(m_client,m_hWnd,10000,FD_READ|FD_CLOSE); / /界面完善 ServerIP.EnableWindow(false); ServerPort.EnableWindow(false); m_ButtonConnect.EnableWindow(false); m_ButtonDisconnect.EnableWindow(); m_EditWords.EnableWindow(); m_ButtonSend.EnableWindow(); m_ButtonExit.EnableWindow(false); m_ButtonClear.EnableWindow();“断开”按钮的事件过程代码如下:void CChatClientDlg:OnDisconnect() /断开与服务器的连接 closesocket(m_client); m_ListWords.AddString(从服务器断开); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); ServerIP.EnableWindow(); ServerPort.EnableWindow(); m_ButtonConnect.EnableWindow(); m_ButtonDisconnect.EnableWindow(false); m_EditWords.EnableWindow(false); m_ButtonSend.EnableWindow(false); m_ButtonExit.EnableWindow();“发送”按钮事件过程代码如下:void CChatClientDlg:OnSend() /向服务器发送信息 UpdateData(); if(m_sWords.IsEmpty() AfxMessageBox(发送的消息不能为空!); return; /开始发送数据 int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0); m_ListWords.AddString(发送: + m_sWords); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);BOOL CChatClientDlg:PreTranslateMessage(MSG* pMsg) if(pMsg-message = 10000)/识别应用程序中定义的消息号 switch(pMsg-lParam)/判断网络事件类型 case FD_READ: this-ReceiveData();/若为FD_READ则接收数据 break; case FD_CLOSE: this-CloseSock();/如果服务端断开,客户端也断开 break; else return CDialog:PreTranslateMessage(pMsg);下面来实现ReceiveData()和CloseSock()方法。首先在头文件ChatClientDlg.h中的类CChatClientDlg中定义这两个方法:void ReceiveData();void CloseSock();然后分别编写这两个方法的代码。ReceiveData()的代码如下:void CChatClientDlg:ReceiveData() char buffer1024; /接收服务器传来的数据 int num = recv(m_client,buffer,1024,0);/函数recv()接收数据 buffernum = 0; /将接收的数据添加到列表框中 CString sTemp; sTemp.Format(收到:%s,buffer); /接收完数据后继续侦测 WSAAsyncSelect(m_client,m_hWnd,10000,FD_READ|FD_CLOSE); m_ListWords.AddString(sTemp); m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);CloseSock()的代码如下:void CChatClientDlg:CloseSock() m_ListWords.AddString(服务器断开了); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); closesocket(m_client); ServerIP.EnableWindow(); ServerPort.EnableWindow(); m_ButtonConnect.EnableWindow(); m_ButtonDisconnect.EnableWindow(false); m_EditWords.EnableWindow(false); m_ButtonSend.EnableWindow(false); m_ButtonExit.EnableWindow();“清空”按钮的事件过程:m_ListWords.ResetContent();“关于”按钮的事件过程:CAboutDlg dlgAbout;dlgAbout.DoModal();服务器端:开始监听代码:void CChatServerDlg:OnListen() WSADATA wsd;/WSADATA结构 WSAStartup(MAKEWORD(2,2),&wsd);/加载协议栈,使用Winsock 2.2版 m_server = socket(AF_INET,SOCK_STREAM,0);/创建流式套接字 /将网络中的事件关联到窗口的消息函数中,定义消息号为20000,侦测客户端的连接请求 WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT); m_client = 0; BYTE nFild4; CString sIP; UpdateData(); if(ServerIP.IsBlank() AfxMessageBox(请设置IP地址!); return; if(sPort.IsEmpty() AfxMessageBox(请设置监听端口!); return; ServerIP.GetAddress(nFild0,nFild1,nFild2,nFild3); sIP.Format(%d.%d.%d.%d,nFild0,nFild1,nFild2,nFild3); /服务器地址 sockaddr_in serveraddr; serveraddr.sin_family = AF_INET; serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP); serveraddr.sin_port = htons(atoi(sPort); /绑定地址 if (bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr) MessageBox(绑定地址失败.); return; /监听开始,服务器等待连接请求的到来 listen(m_server,5); m_ListWords.AddString(监听开始:); m_ListWords.AddString(地址 + sIP + 端口 + sPort); m_ListWords.AddString(等待客户端连接); /界面完善 m_ListWords.SetTopIndex(m_ListWords.GetCount()-1); ServerIP.EnableWindow(false); ServerPort.EnableWindow(false); m_ButtonListen.EnableWindow(false); m_ButtonStopListen.EnableWindow(); m_ButtonClear.EnableWindow(); m_ButtonExit.EnableWindow(false);“停止监听”按钮事件过程代码如下:void CChatServerDlg:OnStopListen() /停止监听 closesocket(m_server); m_ListWords.AddString(停止监听); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); ServerIP.EnableWindow(); ServerPort.EnableWindow(); m_ButtonListen.EnableWindow(); m_ButtonStopListen.EnableWindow(false); m_ButtonExit.EnableWindow();“发送”按钮事件过程代码如下:void CChatServerDlg:OnSend() /向服务器发送信息 UpdateData(); if(m_sWords.IsEmpty() AfxMessageBox(发送的消息不能为空!); return; /开始发送数据 int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0); m_ListWords.AddString(发送: + m_sWords); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);“断开”按钮事件过程代码如下:void CChatServerDlg:OnDisconnect() closesocket(m_client); m_ListWords.AddString(与客户端断开); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); m_ButtonDisconnect.EnableWindow(false); m_EditWords.EnableWindow(false); m_ButtonSend.EnableWindow(false);在头文件ChatServerDlg.h的类CChatServerDlg中声明:void HandleData();/用于接收客户端的连接请求void ReceiveData();void CloseSock();首先为主对话框对象添加PreTranslateMessage()方法。BOOL CChatServerDlg:PreTranslateMessage(MSG* pMsg) if (pMsg-message = 20000)/识别消息号 this-HandleData();/接收客户端的连接请求 else if(pMsg-message = 30000)/识别消息号 switch(pMsg-lParam) case FD_READ: this-ReceiveData();/接收数据 break; case FD_CLOSE: this-CloseSock();/断开连接 break; else return CDialog:PreTranslateMessage(pMsg);调用HandleData()函数,其代码如下:void CChatServerDlg:HandleData() sockaddr_in serveraddr; int len = sizeof(serveraddr); m_client = accept(m_server,(struct sockaddr*)&serveraddr,&len); /在接收请求并为客户端创建对应的套接字后,就开始在该套接字上侦测 /FD_READ和FD_CLOSE事件,指定消息号为30000 WSAAsyncSelect(m_client,m_hWnd,30000,FD_READ|FD_CLOSE); m_ListWords.AddString(接收了一个客户端的连接请求); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); /界面完善 m_ButtonDisconnect.EnableWindow(); m_EditWords.EnableWindow(); m_ButtonSend.EnableWindow();ReceiveData()函数代码如下:void CChatServerDlg:ReceiveData() /接收客户端的数据 char buffer1024; int num = recv(m_client,buffer,1024,0); buffernum = 0; CString sTemp; sTemp.Format(收到:%s,buffer); m_ListWords.AddString(sTemp);/显示信息 m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); /继续侦测客户端的动向 WSAAsyncSelect(m_client,m_hWnd,30000,FD_READ|FD_CLOSE);CloseSock()函数代码如下:void CChatServerDlg:CloseSock() /关闭与客户端的通信信道 m_ListWords.AddString(客户端断开连接); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); closesocket(m_cli

温馨提示

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

评论

0/150

提交评论