网络软件设计15——拆除连接.ppt_第1页
网络软件设计15——拆除连接.ppt_第2页
网络软件设计15——拆除连接.ppt_第3页
网络软件设计15——拆除连接.ppt_第4页
网络软件设计15——拆除连接.ppt_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络软件设计,拆除连接,制作主讲,段景山,2,连接的拆除,传完了数据就该结束了But,Tobe,ornotto,itsaproblem结束,还是不结束,这是个问题不恰当的结束将导致通信的失败失败的通信是前功尽弃的例什么原因可能导致通信失败?当自己没有数据时,就结束错误根源:以自己的状态来评判对方的状态当自己没有数据时不结束容易出现死锁,P88/P105/P112/P114,1、客户发出请求后等待服务器的数据2、服务器发送完数据后等待客户机新的请求3、如果客户机不知道服务器有多少数据时,死锁!4、同理,若服务器不知道客户机有没有新请求时,死锁!,3,拆除连接,所以,什么叫“通信结束”?双方都了解对方没有新的数据时怎样“结束”连接?核心问题怎样了解对方没有新数据?怎样被对方了解自己没有新数据?,4,拆除连接,连接关闭的相关问题有没有多种选择?如关闭双向连接中的一向shutdown(s,SD_SEND);shutdown(s,SD_RECV);对待发/待收数据的处理?如一方强行断链系统发送完待发数据系统丢弃所有的数据要不要释放资源?可否继续利用套接字建立新的连接新的连接新的套接字,5,拆除连接,“通信结束”的方法讨论联想日常生活中,挂电话的情况1、两个人商量好,然后各自挂机过于依赖高层协议,有碍服务器程序的通用性2、一方挂机,另一方听到忙音后挂机过于粗暴3、对于双向通信,A方通知“我没有新数据”了,B方收到通知后,发完自己的数据后就可以挂机了。可以让双方的数据都得到完整交换雅致关闭,设计,6,拆除连接,分别设计各种方式的算法高层协商粗暴关闭雅致关闭,7,拆除连接,1、两个人商量好,然后各自挂机,A,B,(wanttoceasetheconversation),data=“Iwanttostop”;,send(data);,recv(data);,recv(data);,if(data=“Iwanttostop”),if(state=AGREE),send(“Iagree”);,if(data=“Iagree”),closesocket(s);,gotoend;,else,continueconversation,gotoback;,closesocket(s);,gotoend;,else,send(“Ihavemorewords”),continueconversation,8,拆除连接,2、一方挂机,另一方听到忙音后挂机,A,B,(wanttoceasetheconversation),closesocket(s);,send(data);,if(recv(data)0)continueconversation;closesocket(s);,9,3、对于双向通信,A方通知“我没有新数据”了,B方收到通知在发完数据后就可以挂机了。,拆除连接,A,B,(wanttoceasetheconversation),if(state=NO_DATA_SEND),shutdown(SD_SEND);,if(recv(data)0),processdata;,closesocket(s);,雅致关闭,思考:在processdata中如果需要发出数据怎么办?,10,雅致关闭,“雅致”关闭是计算机通信系统的特色“雅致”关闭可以使双方的数据都能完整接收/发送雅致关闭有多种方式(算法)可以实现注意雅致关闭与高层协商的区别!高层协商的缺点在于协商的可靠性不高雅致关闭的优点在于通过系统来通报希望结束的信息,提高了通用性和可靠性,降低了实现难度用户通知系统(“我没有数据了”)shutdown(SD_SEND);系统通知用户(“对方没有数据了”)recv()函数的返回值为0!,11,雅致关闭的实现,方法一、利用shutdown标准做法算法思路,A,B,无需要发送的数据后,shutdown(SD_SEND);,可以接收对方的数据直到对方关闭套接字,closesocket(),while(recv(data)0)process(data);,if(recv(data)=0),send(data),closesocket(),雅致关闭并不对服务器和客户机程序有所区分,12,雅致关闭的实现,方法一、利用shutdown标准做法算法,if(状态为发送完毕),shutdown(SD_SEND);,while(recv()0),processdata();,closesocket();,else,send();,if(recv()0),processdata();,else,shutdown(SD_RECV);,13,socket函数与时序,SYN,SYN+ACK,ACK,FIN,FIN,ACK,listen(),connect(),connect()返回,accept(),send(),send(),recv(),recv(),shutdown(SEND),closesocket(),recv()的返回,recv(),recv()的返回值=0,ACK,recv(),recv()的返回值=0,closesocket(),14,雅致关闭,方法二、利用closesocket()不限时逗留设置套接字状态为SO_DONTLINGERSO_DONTLINGER为套接字默认状态调用closesocket();系统并没有将套接字立即关闭,而是在发完套接口结构中待发送队列上的所有数据后才关闭,structsocketshortso_type;shortso_state;structsockbufso_rcv,so_snd;,15,雅致关闭,方法三、利用closesocket()限时逗留设置套接字状态为SO_LINGER,并设置逗留的时间超时时间为非零值调用closesocket();系统并没有将套接字立即关闭,而是在发完套接口结构中待发送队列上的所有数据后,或超时后才关闭若超时还有数据没有发完,只有丢弃数据,完成关闭动作,16,立即关闭,丢弃所有待发送/接收数据的方法设置套接字为SO_LINGER,并设置逗留时间为0调用closesocket(),socket会立即关闭,资源立即释放注:TCP层实体此时配合发送的是RST报文,structlingerimmediately;immediately.l_onoff=1;immediately.l_linger=0;val=setsockopt(sock,SOL_SOCKET,SO_LINGER,(char*),17,socket,TCP/UDP,应用进程,socket结构里的队列,so_q0,so_q,so_rcv,so_snd,数据到达,送出数据,shutdown(),closesocket(),RECV:关闭so_rcv队列、释放数据,SEND:关闭so_snd队列发完so_snd队列上现有数据,DONTLINGER:关闭so_rcv队列发完so_snd上所有数据,立即关闭:关闭并释放so_rcv队列关闭并释放so_snd队列,18,拆除连接小结,小结shutdown和closesocket都可以实现关闭连接,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论