网络编程Socket之TCP之close/shutdown具体解释(续)

网络编程Socket之TCP之close/shutdown具体解释(续)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

接着上一篇网络编程Socket之TCP之close/shutdown具体解释


如今我们看看对于不同情况的close的返回情况和可能遇到的一些问题:


1.默认操作的close

网络编程Socket之TCP之close/shutdown具体解释(续)


说明:我们已经知道write操作返回成功仅仅能说明数据已经发送到套接字的发送缓冲区,不能代表对端已经成功收到数据,close的默认返回成功也仅仅是成功发出了一个FIN分节,也不代表对端已经确认


问题1:假设中途网络发生问题,非常有可能服务端接收不到这个来自client的FIN分节;

问题2:如果server忙,那么来自client的数据由TCP添�到套接字接收缓冲区,下一个FIN分节也被添�到套接字接收缓冲区,然后等待处理,如果正好此时server应用进程崩溃掉,那么这些数据就丢失掉了,server并没有真正收到,而client也永远不会知道;


2.设置SO_LINGER套接字选项且l_linger为正值时的close

网络编程Socket之TCP之close/shutdown具体解释(续)


说明:这样的情况下客户的close要到它的数据和FIN已经被server的TCP确认以后才会返回;


问题:同上问题2


3.设置SO_LINGER套接字选项且l_linger为偏小正值时的close

网络编程Socket之TCP之close/shutdown具体解释(续)


说明:在服务端的确认到达之前,SO_LINGER套接字选项设置的延滞时间到,close将会返回EWOULDBLOCK错误,且套接字发送缓冲区中的不论什么残留数据被丢弃。


问题:同问题2


总结:设置SO_LINGER套接字选项以后,close的成功返回仅仅是告诉我们先前发送的数据的FIN已经由对端TCP确认,而不能告诉我们对端应用进程是否已经读取数据,假设不设置该套接字选项,那么我们连对端TCP是否确认了数据都不知道。


解决方法:

1.使用shutdown(设置SHUT_WR)+read

网络编程Socket之TCP之close/shutdown具体解释(续)


说明:调用写关闭的shutdown以后发送FIN分节,然后运行read,返回0则说明服务端已经读取数据然后发送终止连接的第三个分节(FIN分节)。


2.应用级确认,可由client和服务端指定一个终止协议

tcp本身不提供记录结束标志,tcp是一个字节流协议,没有不论什么记录边界:假设应用程序须要确定记录的边界,它就要自己去实现;


參考:

UNIX Network ProgrammingVolume 1, Third Edition: TheSockets Networking API



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118226.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • anaconda和python版本对照表

    anaconda和python版本对照表python2 python3 anaconda2/3 2.7.14 3.6.5 5.2.0 2.7.14 3.6.4 5.1.0 2.7.14 3.6.3 5.0.1 2.7.13 3.6.2 5.0.0 2.7.13 3.6.1 4.4.0 2.7.13 3.6.0 4.3.1 2….

    2022年5月28日
    486
  • VMM callback「建议收藏」

    VMM callback「建议收藏」vmm的callback调用的是基类,而不是扩展类。这样做的目的,就是不修改原程序结构的基础上来增加或者替换内容,大大的提高了重用性。修改的内容在扩展类中增添。这种思想应该来源于SV中的虚方法,虚方法可以重写其所有基类中的方法,然普通的重写只能在本身及其扩展类中有效。这样就可以调用基类的时候,访问到扩展类中对基类中虚函数的重写。由虚函数发展到虚类,虚类是一个定义抽象概念的类模板,不可以实…

    2022年9月22日
    5
  • 数据库精华,出自 十步一杀的博客

    数据库精华,出自 十步一杀的博客SQLite3一列多行合并为一列一行分类: 数据库2013-06-2517:02 379人阅读 评论(0) 收藏 举报A  B         ———-      1  中  1  人    2  三2  天2  李变成:A  B——————-1  中,

    2022年7月27日
    6
  • pycharm django环境搭建_IDEA如何创建项目

    pycharm django环境搭建_IDEA如何创建项目Django是比较经典的Pythonweb框架,最近刚好在项目中用到了Django,临阵磨枪学了下,这里先总结下如何用Pycharm创建一个Django项目。1首先来说下和Javaweb框架的一些不同个人感觉:使用Javaweb框架的时候,在与数据库进行数据交互时,其实需要写一些SQL语句的,但是使用Django框架,直接通过配置,以及models中的getfilter方法调用,就…

    2022年8月29日
    3
  • python关于缩进_python缩进符号

    python关于缩进_python缩进符号在写作文的时候,老师会告诉我们每段要空两格,这两个空格标志着一个新的段落开始了。在编写程序的时候,我们也要采用类似的方式,通过缩进来表示代码块的开始和结束。认识缩进在之前学过的的例子中,我们所编写的都是简单的表达式语句,没有缩进。但是,要创建复合语句,就需要用到缩进这个重要的概念。我们可以把许多代码行组织到一个代码块中,其中的每一行代码的开始,都保持相同的空格数,通过查看代码行前面的空格数,就可以…

    2022年10月13日
    3
  • BIEE-1 初始化块和变量[通俗易懂]

    BIEE-1 初始化块和变量[通俗易懂]一、初始化块biee初始化块分为资料库、会话两类资料库初始化块:可批量同事定义变量的值配置:1.“编辑数据源”写入sql并分配地址池;2.“编辑数据目标”配置变量,变量的值和初始化sql结果是按顺序匹配的,一对一关系;3.“刷新时间间隔”默认是1小时,即每个一小时系统就会自动执行一遍此初始化块语句,并把结果存在缓冲池中,用户登录系统时,从缓冲池中

    2025年5月24日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号