【文档说明】第10讲提高数据报套接字编程的可靠性课件.ppt,共(22)页,757.453 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-45481.html
以下为本文档部分文字说明:
第10讲提高数据报套接字编程的可靠性内容提要1.数据报套接字编程模型2.基本函数3.程序举例4.UDP不可靠性问题5.UDP服务器的并发性数据报套接字的通信过程①创建套接字,指定使用UDP(不可靠的传输服务)进行通信;②指定本地和远端IP地址和通信端口;④关闭套接字;③进行数据传输;UDP
serverbind()socket()recvfrom()blocksuntildatagramreceivedfromclientprocessrequestsendto()well-knowportsocket()sendto()UDPcl
ientrecvfrom()closesocket()data(request)data(reply)closesocket()数据报套接字的编程模型问题:server如何处理与多个client交互?非
连接模式连接模式sendto/sendrecvfrom/recvconnect(指明远程端点地址)sendto(指明目标)recvfrom(记录来源)数据报套接字使用模式数据报套接字使用模式使用连接模式的客户端编程connect()se
ndto()recvfrom()closesocket()socket()SOCKETsocket(intaf,inttype,intprotocol)①创建套接字——socket②指定本地地址——bindintbind(SOCKETs,conststructsockad
dr*name,intnamelen)本地端口号本地IP地址SOCK_DGRAM基本函数intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,int
tolen)③发送数据——sendto④接收数据——recvfromintrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,structsockaddrFAR*from,intFAR*fromlen)目的IP+目的端口号INA
DDR_BROADCAST是否可通过from参数控制只接收特定来源的报文?否intsend(SOCKETs,constcharFAR*buf,intlen,intflags)intrecv(SOCKETs,charFAR
*buf,intlen,intflags)来源IP+来源端口号发送(sendvs.sendto)Send用于SOCK_STREAM:最常用用于SOCK_DGRAM:套接字地址通过连接函数connect获得Sendto用于S
OCK_DGRAM:最常用用于SOCK_STREAM:to和tolen被忽略,此时,sendto=send问题3:如何选择合适的发送函数?接收(recvvs.recvfrom)Recv:只接收已确定了连接来源的数据用于SOCK_STREAM:最常用用于S
OCK_DGRAM:套接字地址通过连接函数connect获得Recvfrom用于SOCK_DGRAM:最常用用于SOCK_STREAM:from和fromlen被省略,此时,recvfrom=recv问题4:如何选择合适的接收函数?clientserverother问题2:如果
报文丢失,如何处理?问题1:如果出现了噪音数据,客户端应该怎样分辨?问题3:如果服务器没有启动,客户端如何知道?接收缓冲区UDP的不可靠性问题问题4:如果客户端发送的数据量太大,服务器如何处理?解决:增加对数据源的判断问题1:如果出现了噪音数据,客户端应该怎样分辨?……/
/发送用户输入的数据sendto(sockfd,sendline,strlen(sendline),0,pservaddr,servlen);//接收服务器发回的响应recvfrom(sockfd,recvline,MAXLINE,0,preplyad
dr,&len);if(memcmp(pservaddr,preplyaddr,len)==0){输出结果;}……//接收服务器发回的响应recvfrom(sockfd,recvline,MAXLINE,0,NULL
,NULL);问题2:如果报文丢失,如何处理?解决:增加对recvfrom的超时判断//创建套接字sockfd=socket(AF_INET,SOCK_DGRAM,0);//服务器地址赋值:……//设置接收超时nTimeOver=10
00;//超时时限为1000mssetsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTimeOver,sizeof(nTimeOver));while(fgets(sendline,MAXLINE,fp)!=NUL
L){发送请求;接收应答;}……intsetsockopt(SOCKETs,intlevel,intoptname,constchar*optval,intoptlen);报文丢失情况请求报文丢失响应报文丢失××客户A服务
器B进一步解决:带确认的数据报服务A请求B转10,000美金到A帐户超时和重传:用于处理丢失的数据报序列号:用于客户验证一个应答是否匹配相应的请求解决:用ICMP端口不可达错误来判断服务器没有启动。问题3:如果服务器没有启动,客户端如何知道?原理
:当UDP不开放服务时返回端口不可达的ICMP报文。问题:当套接字同时访问多个服务器时,如何判断哪一个服务器没有启动?解决:方法1:使用连接模式方法2:使用原始套接字接收ICMP报文现象:服务器计数收到的数据报个数小于客户端实际发送的数据报个数。
解释:UDP缺乏流量控制解决:预先协商最大的请求和应答数据量使用SO_RCVBUF设置接收缓存问题4:如果客户端发送的数据量太大,服务器如何处理?UDP服务器的并发性循环UDP服务器服务器等待一个客户
请求,读入这个请求,处理这个请求,送回其应答,接着等待下一个请求。并发UDP服务器单次交互的客户请求多次交互的客户请求问题:何时需要并发UDP服务器?时机:当客户的请求处理耗时过长时单次交互客户请求的并发处理服务器客户端端口69子线程客户端子线程多次
交互客户请求的并发处理服务器如何区分来自客户的第一个请求和后续请求?客户端如何获知服务器的后续响应?服务器在新的套接口上绑定临时端口将服务器第一个应答中的源端口号作为后续目的端口多次交互客户请求的并发
处理服务器客户端端口69子线程客户端子线程端口2132端口2133端口2132思考怎样处理ICMP协议消息?