- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络软件设计15——拆除连接资料
段景山 * shutdown没有释放套接字资源,因为还可能接收数据 网络软件设计 拆除连接 制作 主讲 段景山 * 连接的拆除 传完了数据就该结束了 But,To be, or not to,it`s a problem…… 结束,还是不结束,这是个问题…… 不恰当的结束将导致通信的失败 失败的通信是前功尽弃的 例 什么原因可能导致通信失败? 当自己没有数据时,就结束 错误根源:以自己的状态来评判对方的状态 当自己没有数据时不结束 容易出现死锁 P88/P105/P112/P114 1、客户发出请求后等待服务器的数据 2、服务器发送完数据后等待客户机新的请求 3、如果客户机不知道服务器有多少数据时,死锁! 4、同理,若服务器不知道客户机有没有新请求时,死锁! * 拆除连接 所以,什么叫“通信结束”? 双方都了解对方没有新的数据时 怎样“结束”连接? 核心问题 怎样了解对方没有新数据? 怎样被对方了解自己没有新数据? * 拆除连接 连接关闭的相关问题 有没有多种选择?如关闭双向连接中的一向 shutdown(s,SD_SEND); shutdown(s,SD_RECV); 对待发/待收数据的处理?如一方强行断链 系统发送完待发数据 系统丢弃所有的数据 要不要释放资源? 可否继续利用套接字建立新的连接 新的连接--新的套接字 …… * 拆除连接 “通信结束”的方法讨论 联想日常生活中,挂电话的情况 1、两个人商量好,然后各自挂机 过于依赖高层协议,有碍服务器程序的通用性 2、一方挂机,另一方听到忙音后挂机 过于粗暴 3、对于双向通信,A方通知“我没有新数据”了,B方收到通知后,发完自己的数据后就可以挂机了。 可以让双方的数据都得到完整交换 雅致关闭 设计 * 拆除连接 分别设计各种方式的算法 高层协商 粗暴关闭 雅致关闭 * 拆除连接 1、两个人商量好,然后各自挂机 A B (want to cease the conversation) data = “I want to stop”; send(data); recv (data); …… …… recv(data); if(data == “I want to stop”){ if(state == AGREE){ send(“I agree”); if(data == “I agree”){ closesocket(s); goto end; }else{ continue conversation } goto back; closesocket(s); goto end; }else{ send(“I have more words”) continue conversation } * 拆除连接 2、一方挂机,另一方听到忙音后挂机 A B (want to cease the conversation) …… closesocket(s); send(data); if( recv(data) = 0 ){ closesocket(s); goto end; }else continue conversation; 注意:want to cease the conversation往往是由于自己没有 新数据要发。但,不意味着知道对方没有新的数据送来,此时 关闭连接是不妥当的 …… while(recv(data) 0){ continue conversation; } closesocket(s); …… * 3、对于双向通信,A方通知“我没有新数据”了,B方收到通知 在发完数据后就可以挂机了。 拆除连接 A B (want to cease the conversation) …… if(state == NO_DATA_SEND) shutdown( SD_SEND ); if(recv( data ) = 0 ){ state = CLOSE_WAIT; } send( data ); if( state == NO_DATA_SEND){ closesocket(s); goto end; }else{ goto back; } while(recv(data)0) process data; closesocket(s); 雅致关闭 思考:在process data中 如果需要发出数据怎么办? * 雅致关闭 “雅致”关闭是计算机通信系统的特色 “雅致”关闭可以使双方的数据都能完整接收/发送 雅致关闭有多种方式(算法)可以实现 注意雅致关闭与高层协商的区别! 高层协商的缺点在于协商的可靠性不高 雅致关闭的优点在于通过系统来通报希望结束的信息,提高了通用性和可靠性,降低了实现难度 用户通知系统(“我没有数据了”) shutdown(SD_SEN
文档评论(0)