数据报套接字编程 (2).ppt

上传人:小飞机 文档编号:6296646 上传时间:2023-10-14 格式:PPT 页数:34 大小:2.49MB
返回 下载 相关 举报
数据报套接字编程 (2).ppt_第1页
第1页 / 共34页
数据报套接字编程 (2).ppt_第2页
第2页 / 共34页
数据报套接字编程 (2).ppt_第3页
第3页 / 共34页
数据报套接字编程 (2).ppt_第4页
第4页 / 共34页
数据报套接字编程 (2).ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《数据报套接字编程 (2).ppt》由会员分享,可在线阅读,更多相关《数据报套接字编程 (2).ppt(34页珍藏版)》请在三一办公上搜索。

1、第6讲 数据报套接字编程,Windows网络编程基础,内容提要,1、UDP:用户数据报协议2、数据报套接字编程模型3、基本函数4、程序举例5、UDP不可靠性问题6、UDP服务器的并发性,1.UDP:用户数据报协议,1.1 使用TCP传输数据有什么缺点?,服务器,三次握手建立连接,客户,四次交互关闭连接,数据传输,缺点1:传输开销大!,缺点2:资源过耗!,服务器,客户,1.2 UDP:用户数据报协议,多对多通信不可靠服务缺乏流控制报文模式,1.3 数据报套接字编程的适用场合,在可靠的本地环境中运行;,在不可靠的广域网环境中运行;,广播或多播应用程序;,海量数据传输。,优点:灵活性,缺点:不可靠性

2、,不推荐:,推荐:,1.UDP:用户数据报协议,2.数据报套接字编程模型,2.1 数据报套接字的通信过程,创建套接字,指定使用UDP(不可靠的传输服务)进行通信;,指定本地和远端IP地址和通信端口;,关闭套接字;,进行数据传输;,UDP server,bind(),socket(),recvfrom(),blocks until datagram received from client,process request,sendto(),well-know port,socket(),sendto(),UDP client,recvfrom(),closesocket(),data(reque

3、st),data(reply),closesocket(),2.2 数据报套接字的编程模型,问题:server如何处理与多个client交互?,2.3 服务器工作原理,server,UDP,client2,client1,UDP,UDP,datagram,datagram,Socket receivebuffer,TCP服务器的工作原理,非连接模式,连接模式,sendto/send,recvfrom/recv,connect(指明远程端点地址),sendto(指明目标),recvfrom(记录来源),2.4 数据报套接字使用模式,2.4 数据报套接字使用模式,使用连接模式的客户端编程,conn

4、ect(),sendto(),recvfrom(),closesocket(),socket(),1.UDP:用户数据报协议,2.数据报套接字编程模型,3.基本函数,SOCKET socket(int af,int type,int protocol),创建套接字socket,指定本地地址bind,int bind(SOCKET s,const struct sockaddr*name,int namelen),本地端口号,本地IP地址,SOCK_DGRAM,3 基本函数,int sendto(SOCKET s,const char FAR*buf,int len,int flags,cons

5、t struct sockaddr FAR*to,int tolen),发送数据sendto,接收数据recvfrom,int recvfrom(SOCKET s,char FAR*buf,int len,int flags,struct sockaddr FAR*from,int FAR*fromlen),目的IP目的端口号,INADDR_BROADCAST,是否可通过from参数控制只接收特定来源的报文?,否,int send(SOCKET s,const char FAR*buf,int len,int flags),int recv(SOCKET s,char FAR*buf,int

6、len,int flags),来源IP来源端口号,怎样指明目标?,连接模式,怎样获知来源?,recvfrom(,struct sockaddr FAR*from,),非连接模式,connect(,struct sockaddr FAR*name,),sendto(,const struct sockaddr FAR*to,),连接模式,非连接模式,connect(,struct sockaddr FAR*name,),问题1:如何向操作系统注册通信对方的地址?,A,B,A,B,bind(),socket(),connect(),UDP,(协议,目标IP,目标端口,源IP,源端口),问题2:如何

7、控制可接收的数据报类型?,应用进程,接收缓存,发送(send vs.sendto)Send用于SOCK_STREAM:最常用用于SOCK_DGRAM:套接字地址通过连接函数connect获得Sendto用于SOCK_DGRAM:最常用用于SOCK_STREAM:to和tolen被忽略,此时,sendtosend,问题3:如何选择合适的发送函数?,接收(recv vs.recvfrom)Recv:只接收已确定了连接来源的数据用于SOCK_STREAM:最常用用于SOCK_DGRAM:套接字地址通过连接函数connect获得Recvfrom用于SOCK_DGRAM:最常用用于SOCK_STREAM

8、:from和fromlen被省略,此时,recvfrom=recv,问题4:如何选择合适的接收函数?,1.UDP:用户数据报协议,2.数据报套接字编程模型,3.基本函数,4.程序举例,使用UDP传输的服务器回射程序,UDPclient,UDP ECHOserver,fgets,fputs,“abc”,“abc”,“abc”,1.UDP:用户数据报协议,2.数据报套接字编程模型,3.基本函数,5.UDP的不可靠性问题,4.程序举例,client,server,other,问题2:如果报文丢失,如何处理?,问题1:如果出现了噪音数据,客户端应该怎样分辨?,问题3:如果服务器没有启动,客户端如何知道

9、?,接收缓冲区,5.UDP的不可靠性问题,问题4:如果客户端发送的数据量太大,服务器如何处理?,解决:增加对数据源的判断,问题1:如果出现了噪音数据,客户端应该怎样分辨?,/发送用户输入的数据sendto(sockfd,sendline,strlen(sendline),0,pservaddr,servlen);/接收服务器发回的响应recvfrom(sockfd,recvline,MAXLINE,0,preplyaddr,&len);if(memcmp(pservaddr,preplyaddr,len)=0)输出结果;,/接收服务器发回的响应recvfrom(sockfd,recvline,

10、MAXLINE,0,NULL,NULL);,问题2:如果报文丢失,如何处理?,解决:增加对recvfrom的超时判断,/创建套接字sockfd=socket(AF_INET,SOCK_DGRAM,0);/服务器地址赋值:/设置接收超时nTimeOver=1000;/超时时限为1000ms setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTimeOver,sizeof(nTimeOver);while(fgets(sendline,MAXLINE,fp)!=NULL)发送请求;接收应答;,int setsockopt(SOCKET s,int

11、level,int optname,const char*optval,int optlen);,报文丢失情况,请求报文丢失,响应报文丢失,客户A,服务器B,进一步解决:带确认的数据报服务,A请求B转10,000美金到A帐户,超时和重传:用于处理丢失的数据报,序列号:用于客户验证一个应答是否匹配相应的请求,解决:用ICMP端口不可达错误来判断服务器没有启动。,问题3:如果服务器没有启动,客户端如何知道?,原理:当UDP不开放服务时返回端口不可达的ICMP报文。,问题:当套接字同时访问多个服务器时,如何判断哪一个服务器没有启动?解决:方法1:使用连接模式方法2:使用原始套接字接收ICMP报文,现

12、象:服务器计数收到的数据报个数小于客户端实际发送的数据报个数。解释:UDP缺乏流量控制解决:预先协商最大的请求和应答数据量使用SO_RCVBUF设置接收缓存,问题4:如果客户端发送的数据量太大,服务器如何处理?,1.UDP:用户数据报协议,2.数据报套接字编程模型,3.基本函数,5.UDP的不可靠性问题,4.程序举例,6.UDP服务器的并发性,UDP服务器的并发性,循环UDP服务器服务器等待一个客户请求,读入这个请求,处理这个请求,送回其应答,接着等待下一个请求。并发UDP服务器单次交互的客户请求多次交互的客户请求,问题:何时需要并发UDP服务器?,时机:当客户的请求处理耗时过长时,单次交互客户请求的并发处理,服务器,客户端,端口69,子线程,客户端,子线程,多次交互客户请求的并发处理,服务器如何区分来自客户的第一个请求和后续请求?,客户端如何获知服务器的后续响应?,服务器在新的套接口上绑定临时端口,将服务器第一个应答中的源端口号作为后续目的端口,多次交互客户请求的并发处理,服务器,客户端,端口69,子线程,客户端,子线程,端口2132,端口2133,端口2132,思考,怎样处理ICMP协议消息?,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号