《第5讲传送(3)数据报套接字编程课件.ppt》由会员分享,可在线阅读,更多相关《第5讲传送(3)数据报套接字编程课件.ppt(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5讲讲 数据报套接字编程数据报套接字编程WindowsWindows网络编程基础网络编程基础内容提要1、UDP:用户数据报协议2、数据报套接字编程模型3、基本函数4、程序举例5、UDP不可靠性问题6、UDP服务器的并发性1.UDP:1.UDP:用户数据报协议用户数据报协议1.1 使用TCP传输数据有什么缺点?服务器服务器三次握手三次握手建立连接建立连接客户客户四次交互四次交互关闭连接关闭连接数据传输数据传输缺点缺点1:传输开销大!:传输开销大!缺点缺点2:资源过耗!:资源过耗!服务器服务器客户客户 1.2 UDP:用户数据报协议多对多通信多对多通信不可靠服务不可靠服务缺乏流控制缺乏流控制报
2、文模式报文模式1.3 数据报套接字编程的适用场合l在可靠的本地环境中运行;在可靠的本地环境中运行;l在不可靠的广域网环境中运行;在不可靠的广域网环境中运行;l广播或多播应用程序;广播或多播应用程序;l海量数据传输。海量数据传输。优点:灵活性优点:灵活性缺点:不可靠性缺点:不可靠性p 不推荐:不推荐:p 推荐:推荐:1.UDP:1.UDP:用户数据报协议用户数据报协议2.2.数据报套接字编程模型数据报套接字编程模型2.1 数据报套接字的通信过程创建套接字,指定使用创建套接字,指定使用UDPUDP(不可靠的传输服务)(不可靠的传输服务)进行通信;进行通信;指定本地和远端指定本地和远端IPIP地址和
3、通信端口;地址和通信端口;关闭套接字;关闭套接字;进行数据传输;进行数据传输;UDP serverbind()socket()recvfrom()blocks until datagram received from clientprocess requestsendto()well-know portsocket()sendto()UDP clientrecvfrom()closesocket()data(request)data(reply)closesocket()2.2 数据报套接字的编程模型问题:server如何处理与多个client交互?2.3 服务器工作原理serverUDPcl
4、ient2client1UDPUDPdatagramdatagramSocket receivebufferListening serverTCPServerchildServerchildclientclientTCPTCPconnectionconnectionconnectionconnectionconnectionconnectionTCP服务器服务器的工作原理的工作原理p 非连接模式非连接模式p 连接模式连接模式l sendto/sendl recvfrom/recvl connect(指明远程端点地址)(指明远程端点地址)l sendto(指明目标)(指明目标)l recvfro
5、m(记录来源)(记录来源)2.4 数据报套接字使用模式2.4 数据报套接字使用模式使用连接模式的客户端编程使用连接模式的客户端编程connect()sendto()recvfrom()closesocket()socket()1.UDP:1.UDP:用户数据报协议用户数据报协议2.2.数据报套接字编程模型数据报套接字编程模型3.3.基本函数基本函数 SOCKET socket(int af,int type,int protocol)创建套接字创建套接字socket指定本地地址指定本地地址bindint bind(SOCKET s,const struct sockaddr*name,int
6、namelen)本地端口号本地端口号本地本地IP地址地址SOCK_DGRAM3 基本函数int sendto(SOCKET s,const char FAR*buf,int len,int flags,const struct sockaddr FAR*to,int tolen)发送数据发送数据sendto接收数据接收数据recvfromint recvfrom(SOCKET s,char FAR*buf,int len,int flags,struct sockaddr FAR*from,int FAR*fromlen)目的目的IP目的端口号目的端口号INADDR_BROADCAST是否可通
7、过是否可通过fromfrom参数控制只接收特定来源的报文?参数控制只接收特定来源的报文?否否int send(SOCKET s,const char FAR*buf,int len,int flags)int recv(SOCKET s,char FAR*buf,int len,int flags)来源来源IP来源端口号来源端口号p怎样指明目标?怎样指明目标?连接模式连接模式p 怎样获知来源?怎样获知来源?recvfrom(,struct sockaddr FAR*from,)非连接模式非连接模式connect(,struct sockaddr FAR*name,)sendto(,const
8、struct sockaddr FAR*to,)连接模式连接模式非连接模式非连接模式connect(,struct sockaddr FAR*name,)问题问题1 1:如何向操作系统注册通信对方的地址?:如何向操作系统注册通信对方的地址?ABABbind()bind()socket()socket()connect()connect()UDP(协议,目标(协议,目标IPIP,目标端口,源,目标端口,源IPIP,源端口),源端口)IP头UDP头数据IP头UDP头数据IP头UDP头数据问题问题2 2:如何控制可接收的数据报类型?:如何控制可接收的数据报类型?应用进程应用进程接收缓存接收缓存发送(
9、send vs.sendto)Send用于SOCK_STREAM:最常用用于SOCK_DGRAM:套接字地址通过连接函数connect获得Sendto用于SOCK_DGRAM:最常用用于SOCK_STREAM:to和tolen被忽略,此时,sendtosend问题问题3 3:如何选择合适的发送函数?:如何选择合适的发送函数?接收(recv vs.recvfrom)Recv:只接收已确定了连接来源的数据用于SOCK_STREAM:最常用用于SOCK_DGRAM:套接字地址通过连接函数connect获得Recvfrom用于SOCK_DGRAM:最常用用于SOCK_STREAM:from和froml
10、en被省略,此时,recvfrom=recv问题问题4 4:如何选择合适的接收函数?:如何选择合适的接收函数?1.UDP:1.UDP:用户数据报协议用户数据报协议2.2.数据报套接字编程模型数据报套接字编程模型3.3.基本函数基本函数4.4.程序举例程序举例使用UDP传输的服务器回射程序UDPclientUDP ECHOserverfgetsfputs“abc”“abc”“abc”1.UDP:1.UDP:用户数据报协议用户数据报协议2.2.数据报套接字编程模型数据报套接字编程模型3.3.基本函数基本函数5.UDP5.UDP的不可靠性问题的不可靠性问题4.4.程序举例程序举例clientserv
11、erother问题问题2 2:如果报文丢失,如何处理?:如果报文丢失,如何处理?问题问题1 1:如果出现了噪音数据,客户端应该怎样分辨?:如果出现了噪音数据,客户端应该怎样分辨?问题问题3 3:如果服务器没有启动,:如果服务器没有启动,客户端如何知道?客户端如何知道?接收缓冲区接收缓冲区5.5.UDP的不可靠性问题的不可靠性问题问题问题4 4:如果客户端发送的数据量太大,:如果客户端发送的数据量太大,服务器如何处理?服务器如何处理?解决:增加对数据源的判断解决:增加对数据源的判断问题问题1:1:如果出现了噪音数据,客户端应该怎样分辨?如果出现了噪音数据,客户端应该怎样分辨?/发送用户输入的数据
12、发送用户输入的数据sendto(sockfd,sendline,strlen(sendline),0,pservaddr,servlen);/接收服务器发回的响应接收服务器发回的响应recvfrom(sockfd,recvline,MAXLINE,0,preplyaddr,&len);if(memcmp(pservaddr,preplyaddr,len)=0)输出结果;输出结果;/接收服务器发回的响应接收服务器发回的响应recvfrom(sockfd,recvline,MAXLINE,0,NULL,NULL);问题问题2 2:如果报文丢失,如何处理?:如果报文丢失,如何处理?解决:增加对解决:
13、增加对recvfromrecvfrom的超时判断的超时判断/创建套接字创建套接字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)发送请求;发送请求;接收应答;接收应答;n int setsockopt(SOCKET s
14、,int level,int optname,const char*optval,int optlen);p 报文丢失情况报文丢失情况n 请求报文丢失请求报文丢失n 响应报文丢失响应报文丢失客户客户A服务器服务器B进一步解决:进一步解决:带确认的数据报服务带确认的数据报服务A请求请求B转转10,000美金到美金到A帐户帐户n 超时和重传:用于处理丢失的数据报超时和重传:用于处理丢失的数据报n 序列号:用于客户验证一个应答是否匹配相应的请求序列号:用于客户验证一个应答是否匹配相应的请求解决:用解决:用ICMPICMP端口不可达错误来判断服务器没有启动。端口不可达错误来判断服务器没有启动。问题问题
15、3 3:如果服务器没有启动,客户端如何知道?:如果服务器没有启动,客户端如何知道?p 原理:当原理:当UDP不开放服务时返回端口不可达的不开放服务时返回端口不可达的ICMP报文。报文。p 问题:当套接字同时访问多个服务器时,如何判断哪一个问题:当套接字同时访问多个服务器时,如何判断哪一个服务器没有启动?服务器没有启动?p 解决:解决:p方法方法1:使用连接模式:使用连接模式p方法方法2:使用原始套接字接收:使用原始套接字接收ICMP报文报文现象:服务器计数收到的数据报个数小于现象:服务器计数收到的数据报个数小于客户端实际发送的数据报个数。客户端实际发送的数据报个数。解释:解释:UDP缺乏流量控
16、制缺乏流量控制解决:解决:预先协商最大的请求和应答数据量预先协商最大的请求和应答数据量使用使用SO_RCVBUF设置接收缓存设置接收缓存问题问题4 4:如果客户端发送的数据量太大,:如果客户端发送的数据量太大,服务器如何服务器如何处理?处理?1.UDP:1.UDP:用户数据报协议用户数据报协议2.2.数据报套接字编程模型数据报套接字编程模型3.3.基本函数基本函数5.UDP5.UDP的不可靠性问题的不可靠性问题4.4.程序举例程序举例6.UDP6.UDP服务器的并发性服务器的并发性UDPUDP服务器的并发性服务器的并发性循环循环UDP服务器服务器服务器等待一个客户请求,读入这个请求,处理这个请
17、服务器等待一个客户请求,读入这个请求,处理这个请求,送回其应答,接着等待下一个请求。求,送回其应答,接着等待下一个请求。并发并发UDP服务器服务器单次交互的客户请求单次交互的客户请求多次交互的客户请求多次交互的客户请求问题:何时需要并发问题:何时需要并发UDPUDP服务器?服务器?时机:当客户的请求处理耗时过长时时机:当客户的请求处理耗时过长时单次交互客户请求的并发处理单次交互客户请求的并发处理服务器客户端端口69子线程客户端子线程多次交互客户请求的并发处理多次交互客户请求的并发处理服务器如何区分来自客户的第一个请求和后续请求?服务器如何区分来自客户的第一个请求和后续请求?客户端如何获知服务器的后续响应?客户端如何获知服务器的后续响应?服务器在新的套接口上绑定临时端口服务器在新的套接口上绑定临时端口将服务器第一个应答中的源端口号作为后续目的端口将服务器第一个应答中的源端口号作为后续目的端口多次交互客户请求的并发处理多次交互客户请求的并发处理服务器客户端端口69子线程客户端子线程端口2132端口2133端口2132思考p 怎样处理怎样处理ICMPICMP协议消息?协议消息?
限制150内