




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络程序设计实验报告 实验名称: UDP通信实验 实验类型: 验证型 指导教师: 贾浩 专业班级: 信安1204 姓 名: 马灿 学 号: 20123252 电子邮件: 实验地点: 东6 E307 实 验 日 期: 实验成绩:_ 一、实验目的进一步理解Winsock API的调用方法了解UDP协议的工作原理掌握UDP服务端程序和客户端程序的编写流程熟悉程序的调试方法。二、实验设计1.背景知识l 数据报套接字编程使用的函数1) 创建套接字函数socket()SOCKET socket(int af,int type,int protocol);由于采用数据报套接字进行数据传输,因此type参数必须设置为SOCK_DGRAM,protocol参数必须设置为IPPROTO_UDP2) 绑定本地地址到所创建的套接字函数bind()int bind(SOCKET s,const struct sockaddr* name,int namelen);在实际编程时可以省略该函数,系统会自动绑定3) 接收数据函数recvfrom()int recvfrom(SOCKET s,char* buf,int len,int flags,struct sockaddr* from,int* fromlen);4) 发送数据函数sendto()int sendto(SOCKET s,const char* buf,int len,int flags,const struct sockaddr* to,int* tolen);5) 关闭套接字函数closesocket()int closesocket(SOCKET s);l 数据报套接字编程模型时序和流程为便于理解数据报套接字模型下的编程过程,用时序图表述如下(请注意,时序图不同于程序流程图,它只是对完成一次通信过程进行原理性描述的手段。客户端sendto()closesocket()recvfrom()closesocket()sendto()处理服务请求bind()recvfrom()bind()socket()服务端阻塞,等待客户连接请求服务请求服务应答socket()流套接字编程时序图2.实验内容(1)、认真理解数据报套接字编程模型,仔细阅读并调试运行UDPserve.cpp程序和UTPClient.cpp程序源代码,分析在服务端和客户端分别使用了哪些Winsock API函数,写入实验报告;(2)、修改UDPServer和UDPClient程序,设计一个简单的UDP通信程序,并达到以下要求:双方能相互发送数据,并显示接收到的数据。当收到对方的数据为“bye”时,能退出程序。(3)、编程验证实验思考题中问题。(4)、选做,服务器同多个客户端通信。3.实现双方通信设计在数据报套接字编程模型中,客户端发送数据(也称发送端),服务器端接收数据(也称接收端)。实际上,由于数据报套接字编程模型也支持双向数据传递,因此,服务器端和客户端的概念已经比较模糊。在设计时有以下几个重要事项:1)UDP编程属于阻塞模式,只能实现双方交替通信,也就是说服务端收到客户端发送的消息后要给客户端回发消息后客户端才能继续给服务端发送消息。反之亦然。要实现单方多次发送消息是后面的实验内容。2)UDP服务器程序UDPServer运行之后,进入无限循环,监听4567端口到来的UDP封包,如果发现就将用户数据以字符串形式打印出来,然后继续给客户端发送消息。尤其要注意的是实验要求接收到“bye”就结束通信,因此每收到一个消息将其打印后还必须得对接收到的数据字符串进行检验,如果是“bye”那么就关闭套接字,结束通信。因为你向对方发送了“bye”的结束信号,对方要关闭套接字结束通信,所以于此同时你也得关闭套接字。实现方法很简单,就是在接收和发送数据的时候都对数据进行一次检验,如果是“bye”那么就可以结束了。3)UDP客户端程序UDPCLient和服务器段程序类似,也是运行之后,进入无限循环,监听服务端发来的UDP封包,如果发现就将用户数据以字符串形式打印出来,然后继续给客户端发送消息。尤其要注意的是实验要求接收到“bye”就结束通信,因此每收到一个消息将其打印后还必须得对接收到的数据字符串进行检验,如果是“bye”那么就关闭套接字,结束通信。因为你向对方发送了“bye”的结束信号,对方要关闭套接字结束通信,所以于此同时你也得关闭套接字。实现方法很简单,就是在接收和发送数据的时候都对数据进行一次检验,如果是“bye”那么就可以结束了。三、实验过程1、实验分析与设计2、编码实现3、程序调试在这个实验中主要遇到以下几个问题:1)问题描述:在一方接收到“bye”结束信息之后对方还能给自己发信息,但是自己不能向对方发信息,也就是没有关闭对方的通信套接字。原因或解决办法:在接收数据和发送数据的时候都要进行一次检测,不论是接收的数据还是发送的数据,只要检测到为“bye”那么就关闭套接字结束通信,这样只要一方发送了“bye”结束信息双方就都关闭了套接字。2)问题描述:这个问题不属于设计上的错误,而是语言语法掌握不牢靠。之前在判断接收或发送数据是否为“bye”时用成了“=”,导致即使我发了“bye”还是不能结束程序。后来发现了原因,字符串的比较应该是用“strcmp()”函数比较。实验结果:客户端截图服务器结果如下四、讨论与分析1、能否在接收数据之间不进行bind()调用?如果能,请说明可能的情况。答:可以。创建套接字之后如果首先调用的是sendto()函数则可以不调用bind()函数显示的绑定本地地址,系统会自动的为程序绑定,因此今后即便是调用recvfrom()也不会失败。但是,如果创建套接字之后直接调用recvfrom()就会失败,因为套接字没有绑定。2、能否使用connect()连接对方?为什么?答:不能。因为UDP编程是一个简单的面向数据报的传输层协议,它提供了面向无连接的,不可靠的数据报传输服务。它不像TCP那样在通信之前要先与对方取得连接以确定对方的状态。3、能否在不调用sendto()函数之前调用recvfom()函数。答:可以。此时只需要在调用recvfrom()函数之前显示的将套接字和本地地址绑定即可。5、 实验者自评 通过本实验,基本掌握了UDP编程客户端和服务端的通信流程及双方的通信机制。通过自己独立的设计实现了简单的双方交替通信,加深了对UDP编程无需连接的不可靠的数据传输服务,同时熟悉了以下几个函数的使用:创建套接字函数socket(),绑定本地地址到所创建的套接字函数bind(),接收数据函数recvfrom(),发送数据函数sendto(),关闭套接字函数closesocket()。六、附录:关键代码(给出适当注释,可读性高)1、封装对WinSock库初始化的类classCInitSockpublic:CInitSock(BYTEminorVer=2,BYTEmajorVer=2)/初始化WS2_32.dllWSADATAwsadata;WORDsockVersion=MAKEWORD(minorVer,majorVer);if(:WSAStartup(sockVersion,&wsadata)!=0)exit(0);CInitSock():WSACleanup();2、服务器程序/创建套节字SOCKETs=:socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(s=INVALID_SOCKET)printf(Failedsocket()n);return0;/填充sockaddr_in结构sockaddr_insin;sin.sin_family=AF_INET;sin.sin_port=htons(4567);sin.sin_addr.S_un.S_addr=INADDR_ANY;/绑定这个套节字到一个本地地址if(:bind(s,(LPSOCKADDR)&sin,sizeof(sin)=SOCKET_ERROR)printf(Failedbind()n);return0;/接收数据charreceivebuff1024;charsendbuff1024;sockaddr_inaddr;intnLen=sizeof(addr);printf(*我是服务端*n);while(TRUE)intnRecv=:recvfrom(s,receivebuff,1024,0,(sockaddr*)&addr,&nLen);if(nRecv0)/接收数据receivebuffnRecv=0;printf(Client:%sn,receivebuff);if(strcmp(receivebuff,bye)=0):closesocket(s);return0;/发送数据/scanf(%s,sendbuff);gets(sendbuff);:sendto(s,sendbuff,strlen(sendbuff),0,(sockaddr*)&addr,sizeof(addr);system(color0A);printf(Server:%sn,sendbuff);if(strcmp(sendbuff,bye)=0):closesocket(s);return0;3、客户端程序/创建套节字SOCKETs=:socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(s=INVALID_SOCKET)printf(Failedsocket()%dn,:WSAGetLastError();return0;/也可以在这里调用bind函数绑定一个本地地址/否则系统将会自动安排/填写远程地址信息sockaddr_inaddr;addr.sin_family=AF_INET;addr.sin_port=htons(4567);intnLen=sizeof(addr);/注意,这里要填写服务器程序所在机器的IP地址/如果你的计算机没有联网,直接使用127.0.0.1即可addr.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);/发送数据charreceivebuff1024;charsendbuffer1024;printf(*我是客户端*n);while(TRUE)intnRecv=:recvfrom(s,receivebuff,1024,0,(sockaddr*)&addr,&nLen);if(nRecv0)/接收数据receivebuffnRecv=0;printf(Server:%sn,receivebuff);if(strcmp(receiveb
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年注册消防工程师考试案例分析模拟试题及解析
- 2025江苏盐城选聘物业管理营商环境体验员考前自测高频考点模拟试题及答案详解(名师系列)
- 2025江苏常州市天宁区卫生健康局下属事业单位招聘18人考前自测高频考点模拟试题及完整答案详解一套
- 2025黑龙江鸡西市博物馆现公益性岗位招聘2人模拟试卷及答案详解(必刷)
- 2025湖北恩施州巴东县农业农村局公益性岗位招聘1人考前自测高频考点模拟试题附答案详解(突破训练)
- 2025内蒙古航开城市建设投资有限责任公司及子公司招聘20人模拟试卷及完整答案详解1套
- 2025年洛阳市考古研究院引进急需短缺人才模拟试卷有答案详解
- 2025内蒙古锡林郭勒盟锡林浩特市招募公益性岗位139人模拟试卷及答案详解(名校卷)
- 2025年新乡市开发公益性岗位安置就业困难毕业生25人模拟试卷附答案详解(典型题)
- 2025河南郑州工程技术学院招聘81人考前自测高频考点模拟试题及答案详解(名校卷)
- JTGT F20-2015 公路路面基层施工技术细则
- 拒绝假努力让学习扎根(主题班会)
- 学而思七年级数学培优讲义全年级章节培优经典
- 口腔颌面颈部脉管神经与局部解剖-神经(口腔解剖生理学课件)
- 第二版《高中物理题型笔记》上册
- 工艺美术运动代表人物及作品
- (完整版)高考英语考纲3500词汇表
- 洁净厂房监理实施细则
- 初中语文人教九年级下册余光中《乡愁》PPT
- 置业顾问培训方案
- 无陪护病房实施方案
评论
0/150
提交评论