版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、网络程序设计实验报告实验名称:_UDP通信实验实验类型:验证型实验指导教师:专业班级:_姓名:学号:电子邮件:实验地点:实验成绩:、实验目的?1、进一步理解WinsockAPI的调用方法?2、了解UDP协议的工作原理?3、掌握UDP服务端程序和客户端程序的编写流程?4、熟悉程序的调试方法。二、实验设计1、数据报套接字编程模型时序和流程服务端socket ()recvfrom ()bind ()客户端socket ()bind ()it 执 注 户 客 待 等服务请求sendto ()处理服务请求sendto ()服务应答recvfrom ()closesocket ()closesocket(
2、)图1:流套接字编程时序图2、用到的WinsockAPI函数有:1)、创建套接字函数socket()SOCKETsocket(intaf,inttype,intprotocol);由于采用数据报套接字进行数据传输,因此type参数必须设置为SOCK_DGRAMprotocol参数必须设置为IPPROTO_UDP2)、绑定本地地址到所创建的套接字函数bind()intbind(SOCKETsconststructsockaddr*name,intnamelen);3)、接收数据函数recvfrom()intrecvfrom(SOCKETschar*buf,intlen,intflags,stru
3、ctsockaddr*from,int*fromlen);4)、发送数据函数sendto()intsendto(SOCKETsconstchar*buf,intlen,intflags,conststructsockaddr*to,int*tolen);5)、关闭套接字函数closesocket()intclosesocket(SOCKET方;3、服务端的程序流程图如下:说明:服务端的程序首先要调用函数socket(AF_INET,SOCK_DGRAM,IPPROTO_U现建一个监听套接字,用于监听是否有客户端发送数据过来,然后调用bind(s,(LPSOCKADDR)&sin,sizeof(
4、sin)绑定该监听套接字至ij一个本地地址,接下来是一个循环语句,循环跳出的条件是客户端发来的数据是bye或自己发送给客户端的数据为bye,当接收到数据为bye或自己发出bye时关闭套接字,结束程序,否则就接受数据,输出接受到的数据,然后输入发送给客户端的数据,以此循环。图2:服务端收发数据的流程图4、客户端的程序流程图如下:说明:客户端的程序首先要调用函数socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP建一个套接字,然后声明一个sockaddr_in类型的变量addr,存放服务端的地址信息,接下来是一个循环语句,循环跳出的条件是服务端发来的数据是bye或自己发送给服
5、务端的数据为bye,当接收到数据为bye或自己发出bye时关闭套接字,结束程序,否则就输入发送给服务端的数据,接受数据,输出收到的数据,以此循环。图2:客户端收发数据的流程图三、实验过程(包含实验结果)1、遇到的错误有:1)、当客户端发送bye时,服务端收到数据,但是客户端和服务端都未结束通话错误原因:当判断接受数据是否为bye时,用的代码是if(recMsg=bye),未用判断字符串的函数strcmp(recMsg,bye),当客户端发送bye后,未判断自己是否发送的bye导致客户端未退出。2、实验结果:1)、服务端运行结果如下:2)、客户端运行结果如下:四、讨论与分析1)、能否在接收数据之
6、间不进行bind()调用?如果能,请说明可能的情况。答:创建套接字之后,如果首先调用的是sendto函数,则可以不调用bind函数显式地绑定本地地址,系统会自动为程序绑定,但是如果创建套接字后,直接调用recvfrom就会失败,因为套接字还没有绑定。2)、能否使用connect()连接对方?为什么?答:UDP中可以使用connect系统调用,UDP中connect操作与TCP中connect操作有着本质区别,TCP中调用connect会引起三次握手,client与server建立连结,UDP中调用connect内核仅仅把对端ip和port记录下来,UDP中可以多次调用connect,TCP只能
7、调用一次connect。采用connect的UDP发送接受报文可以调用send,write和recv,read操作.当然也可以调用sendto,recvfrom.调用sendto的时候第五个参数必须是NULL,第六个参数是0.调用recvfrom,recv,read系统调用只能获取到先前connect的ip&port发送的报文。3)、能否在不调用sendto()函数之前调用recvfom()函数。答:服务端可以在不调用sendto()函数之前调用recvfom()函数,因为服务端要在接受到客户端数据后才发送数据到客户端,但是客户端必须先调用sendto函数后才能调用recvfom函数,因为,当
8、没有客户端发来数据时,服务端一直处于监听状态,客户要先调用sendto函数才能让服务端不处于阻塞模式,然后再调用recvfom接受服务端发来的数据。五、实验者自评由于本次实验是验证型实验,代码是书上现成的,但是通过自己看代码,分析代码并画出了程序的流程图,我进一步理解了WinsockAPI的调用方法,也了解了UDP协议的工作原理,并掌握了UDP服务端程序和客户端程序的编写流程,在做实验的过程中也出现了许多问题,通过调试代码,我更加熟悉了程序的调试方法,把遇到的问题都一一解决了,而且通过实际分析代码,修改代码,对老师课堂上将的理论知识理解更加深刻,体会也更加深刻。通过此次的实验,我达到了本次实验
9、的目的,也巩固了课堂上老师讲授的基础知识,是一次非常有意义的实验。六、附录:关键代码(给出适当注释,可读性高)1、服务端程序代码:#include#includeinitsock.hCInitSockinitSock;/初始化Winsock库intmain()/创建套接字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_po
10、rt=htons(4567);sin.sin_addr.S_un.S_addr=INADDR_ANY;/绑定这个套接字到一个本地地址if(:bind(s,(LPSOCKADDR)&sin,sizeof(sin)=SOCKET_ERROR)printf(Faildbind()n);return0;printf(nnn*服务端*nn);charrecMsg1024;charsendMsg1024;sockaddr_inaddr;intnLen=sizeof(addr);printf(等待数据的到来:n);while(TRUE)intnRecv=recvfrom(s,recMsg,1024,0,(s
11、ockaddr*)&addr,&nLen);if(nRecv0)recMsgnRecv=0;printf(接收到数据(%s):%sn,:inet_ntoa(addr.sin_addr),recMsg);if(strcmp(recMsg,bye)=0)printf(关闭套接字,结束对话!);closesocket(s);return0;printf(请输入发送数据:n);gets(sendMsg);sendto(s,sendMsg,strlen(sendMsg),0,(sockaddr*)&addr,sizeof(addr);if(strcmp(sendMsg,bye)=0)printf(关闭套
12、接字,结束对话!);closesocket(s);return0;closesocket(s);2、客户端程序代码:#include#includeinitsock.hCInitSockinitSock;/初始化Winsock库intmain()SOCKETs=:socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(s=INVALID_SOCKET)printf(Failedsocket()%dn,:WSAGetLastError();return0;/填写远程地址信息sockaddr_inaddr;addr.sin_family=AF_INET;addr.sin_port=htons(4567);printf(nnn *客户端 *坨坨);charrecMsg1024;charsendMsg1024;intnLen=sizeof(addr);while(TRUE)printf(请输入发送数据:n);gets(sendMsg);二sendto(s,sendMsg,strlen(sendMsg),0,(sockaddr*)&addr,sizeof(addr);if(strcmp(sendMsg,bye)=0)printf(关闭套接字,结束对话!);closesocket(s);return0;intnRecv=recvfrom(s,re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司工作计划六篇
- 2022年小学教师工作计划
- 护士长每周工作计划
- 2024年农村广播电视行业发展监测及投资战略咨询报告
- 事故赔偿协议书汇编五篇
- 参观类实习报告模板合集九篇
- 大学生创新创业思维与行动 课件 第五章 创业思维概述
- 市场方案策划模板锦集五篇
- 会计实习周记格式5篇
- -护士长述职报告
- 高端行业用户分析
- 2023年中国软件行业基准数据SSM-BK-202310
- 人教版六年级数学下册全册分层作业设计含答案
- 2024年中考英语复习:阅读七选五 专项练习题汇编(含答案解析)
- 马克思主义与社会科学方法论概述(课件)
- 2024年国投信托有限公司招聘笔试参考题库含答案解析
- 自身免疫性肝炎的护理查房
- 《卜算子-黄州定慧院寓居作》理解性默写(含答案)
- 少先队大队辅导员胜任力模型研究
- 人才队伍建设实施方案
- 德钦县云岭乡、佛山乡部分村落生活垃圾处置工程环评报告
评论
0/150
提交评论