ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:1.05MB ,
资源ID:8005704      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8005704.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(东南大学计算机网络第三次实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

东南大学计算机网络第三次实验报告.docx

1、东南大学计算机网络第三次实验报告东南大学自动化学院实 验 报 告课程名称: 信息通信网络概论 第3次实验实验名称: 实验三 基于客户/服务器模式的网络通信编程实现 院 (系): 自动化 专 业: 自动化 姓 名: 学 号: 实 验 室: 金智楼 实验组别: 同组人员: 实验时间: 2016 年 12 月 13 日评定成绩: 审阅教师: 一实验目的和要求3二实验原理3三. 实验方案与实验步骤4四实验设备与器材配置5五实验记录5六实验总结 10七思考题或讨论题 11附录:部分代码一 实验目的和要求1. 进一步了解网络编程的过程;2. 掌握Windows环境下基于WinSock的编程方法和通信实现;

2、 3. 熟悉客户/服务器模式的网络通信编程实现,编写一个聊天工具,即以客户端和服务器端的模式进行互发消息。二 实验原理一个在建立分布式应用时最常用的范例便是客户机/服务器模型。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性。客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地认为是主机,而另一方则是从机。一个对称协议的例子

3、是Internet中用于终端仿真的TELNET。而非对称协议的例子是Internet中的FTP。无论具体的协议是对称的或是非对称的,当服务被提供时必然存在“客户进程”和“服务进程”。 一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被“惊醒”并且为客户提供服务对客户的请求作出适当的反应。这一请求/相应的过程可以简单的用图2-1表示。虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的。图2-1 客户机/服务器模型三 实验方案与实验步骤1、 客户机

4、/服务器工作流程图3.1 客户机/服务器工作流程2、 聊天室的工作流程图3.2 聊天室工作流程首先,服务器要创建一个用于侦听的套接字,为该套接字分配地址之后,调用listen()函数使它处于侦听状态;客户机在创建套接字完毕后,为套接字分配地址,然后调用connect()函数,请求与服务器套接字连接;服务器套接字在收到客户机的连接请示后,调用accept()函数,该函数创建一个用于连接的套接字。应用该套接字和客户机上的连接套接字,用户就可以在服务器和客户机之间进行数据传输了。在结束传输之后,客户机调用closesocket()函数关闭套接字,服务器也调用该函数关闭用于侦听和连接的套接字。3、 套

5、接字事件处理相关函数OnAccept():监听套接字在断口听到连接请求时,应用程序框架调用该函数以告之可以接受或拒绝连接请求,调用Accept来接受请求,建立连接。OnConnect():当客户端套接字连接请求完成后,应用程序框架调用该函数,告之是否成功。OnSend():框架调用该函数通知该套接字现在可以调用Send函数开始传送数据。OnReceive():框架调用该函数通知套接字可以调用Receive函数从数据缓冲区中取数据。OnClose():框架调用该函数告之与其相连的对方套接字已被关闭。4、 系统实现图3.3 系统实现过程四 实验设备与器材配置电脑、VC6.0五 实验记录1、 界面(

6、1) 选择:客户机、服务器;(2) 输入:服务器名称、服务器端口、发送的消息;(3) 输出显示:发送的消息、接收的消息、发送和接收消息数目;(4) 按钮:连接/侦听、断开、发送、清空。图5.1 界面设计2、 功能描述(1)服务器端i. 建立Socket,绑定端口,并监听;ii. 接受客户端的连接;iii. 与客户端进行通讯;iv. 断开连接。图5.2 服务器端(2)客户端i. 建立Socket,并申请连接到服务器;ii. 与服务器进行通讯;iii. 断开连接。图5.3 客户机端3、 改进(1) 获取对方主机信息通过函数gethostname(hostname,sizeof(hostname)得

7、到主机名,客户机获得服务器主机名为2013-20140524WQ,服务器获得客户机主机名为2013-20140524WQ(实验时使用同一台电脑进行调试,所以主机名是一样的),添加到接收信息列表中信息前面。(2) 添加发送接收时间通过函数time()、localtime()获得当前系统时间,能够显示发送接收时间,格式为年/月/日 时/分/秒,添加到接收信息列表中信息首部。(3) 显示发送、接收消息总数通过m_list.GetCount()函数实现对列表中发送和接收到的信息计数,并显示在界面上,清空列表后,相应的重置为0。(4) 清空列表通过函数m_list.ResetContent()实现清空列

8、表。(5) 添加背景图片、改变控件背景色、字体等。上传bmp图片到Bitmap资源文件夹中,在OnPaint()中添加代码,通过不同图片的ID来设置不同的背景图片。通过加入WM_CTLCOLOR消息,自动生成OnCtlColor()函数,利用SetBkMode()、SetTextColor()、SetBkColor()、CreateSolidBrush()、SetFont()等函数设置背景格式、改变控件背景色和字体大小颜色等。图5.4 改进功能六 实验总结在原demo程序的基础上,增加了获取对方主机名、添加发送时间、清空列表等功能,并且尝试添加背景图片,利用WM_CTLCOLOR消息实现对MF

9、C界面的修改。通过本次实验,我对“点对点”模型有了非常深刻的认识,进一步了解了网络编程的过程,掌握了Windows环境下基于WinSock的编程方法和通讯实现,并且实现了客户端和服务器的连接通信。对相关套接字事件处理函数OnAccept()、OnConnect()、OnSend()、OnReceive()、OnClose()有了一定了解,熟悉了服务器和客户端不同的工作流程。七 思考题或讨论题1、 结合所学知识,谈谈自己对TCP三次握手的理解。1) 主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;2) 主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发

10、送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;3) 主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。2、 TCP协议有什么优点,根据你的理解说说为什么http要采用TCP作为底层协议?(1) 优点:面向连接、传输可靠、无拥塞、无乱序、无丢包、完整性检查、可重传;(2) TCP协议对应于传输层,而HTTP协议对应于应用层,Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。H

11、ttp会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开。附录:(部分代码)1、获取对方主机信息添加发送接收时间void CTalkDlg:OnReceive() CString mDay; CString mTime; CString ttime; time_t t1; t1 = time(NULL); /机器时间 struct tm *p; p = localtime(&t1); /转换为本地时间 mDay.Format(%4d/%2d/%2d,1900+p-tm_year,1+p-tm_mon,p-tm_mday); mTime.Form

12、at(%3d:%2d:%2d,p-tm_hour,p-tm_min,p-tm_sec); char* pBuf = new char1025;/char pBuf1025; int nBufSize = 1024; int nReceived; char hostname100; CString strReceived; nReceived = m_sConnectSocket.Receive(pBuf,nBufSize); /接收消息 /判断消息接收是否成功? if(nReceived!=SOCKET_ERROR) gethostname(hostname,sizeof(hostname);

13、 /获取对方主机信息 pBufnReceived = NULL; /保留接收消息的有效部分 strReceived = pBuf; /将消息转化为CString对象 /添加主机信息和发送时间 strReceived=mDay+mTime+ +hostname+: +strReceived; /将消息添加到“已接收的消息”列表框 m_listReceived.AddString(strReceived); m_Countb = m_listReceived.GetCount();/显示接收信息数 UpdateData(FALSE); /更新对话框 else AfxMessageBox(信息接收错

14、误!,MB_OK|MB_ICONSTOP); delete pBuf;2、 显示发送、接收消息总数void CTalkDlg:OnSendMsg() CString mDay; CString mTime; CString ttime; time_t t1; t1 = time(NULL); /机器时间 struct tm *p; p = localtime(&t1); /转换为字符串时间 mDay.Format(%4d/%2d/%2d,1900+p-tm_year,1+p-tm_mon,p-tm_mday); mTime.Format(%3d:%2d:%2d,p-tm_hour,p-tm_m

15、in,p-tm_sec); int nLen;/消息长度 int nSent;/已发送消息的长度 /从对话框取回数据 UpdateData(TRUE); /判断要发送的消息是否为空 if(!m_strMsg.IsEmpty() nLen = m_strMsg.GetLength();/获取消息的长度 nSent = m_sConnectSocket.Send(LPCTSTR(m_strMsg),nLen); /发送消息 if(nSent!=SOCKET_ERROR) /发送是否成功 /添加主机信息和发送时间 m_strMsg=mDay+mTime+ send: +m_strMsg; /将消息添

16、加到“已发送列表框” m_listSent.AddString(m_strMsg); m_Counta = m_listSent.GetCount();/显示发送信息数 UpdateData(FALSE); /更新对话框 else AfxMessageBox(信息发送错误,MB_OK|MB_ICONSTOP); m_strMsg.Empty();/清除当前信息 UpdateData(FALSE); 3、 清空列表void CTalkDlg:OnButton1() / TODO: Add your control notification handler code here m_listSent

17、.ResetContent();/清空发送列表 m_Counta = m_listSent.GetCount();/重置发送消息数 UpdateData(FALSE);void CTalkDlg:OnButton2() / TODO: Add your control notification handler code here m_listReceived.ResetContent();/清空接受列表 m_Countb = m_listReceived.GetCount();/重置接收消息数 UpdateData(FALSE);4、 添加背景图片void CTalkDlg:OnPaint()

18、 if (IsIconic() CPaintDC dc(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width()

19、- cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; / Draw the icon dc.DrawIcon(x, y, m_hIcon); else /CDialog:OnPaint(); CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP3); /IDB_BITMAP3是

20、对应的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); Cbitmap*pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); 5、 改变背景色、字体大小颜色HBRUSH CProject2Dlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) HBRUSH hbr

21、= CDialog:OnCtlColor(pDC, pWnd, nCtlColor); / TODO: Change any attributes of the DC here /设置显示字体CFont * cFont=new CFont;cFont-CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,Arial); if(pWnd = this)/改变整个界面背景色 HBR

22、USH brush=CreateSolidBrush(RGB(199,237,204); return (HBRUSH)brush; switch(nCtlColor) case CTLCOLOR_STATIC: /对所有静态文本控件的设置 pDC-SetBkMode(TRANSPARENT); /设置背景为透明 pDC-SetTextColor(RGB(255,255,0); /设置字体颜色 pWnd-SetFont(cFont); /设置字体 HBRUSH B = CreateSolidBrush(RGB(199,237,204); /创建画刷 return (HBRUSH) B; /返回画刷句柄 break; default: return CDialog:OnCtlColor(pDC,pWnd, nCtlColor); / TODO: Return a different brush if the default is not desired return hbr;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1