网络编程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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dpkg强制卸载

    dpkg强制卸载dpkg的一个强制卸载的方法安mysql的时候因为玄学国家防火墙,安到一般被阻断了,再卸的时候各种依赖不对,dpkg-r/-P怎么都卸不掉,提示有依赖卸载包的东西,找到一个–force-all就可成功卸载了,但有的包可能出现缺少依赖的情况,最好还是不要烦躁看清楚依赖关系!另外aptautoremove千万别随便用,可能把系统的基本组件也给你卸掉…

    2022年9月27日
    2
  • java记录访问时间_在java中记录上次访问时间和上次修改时间?

    java记录访问时间_在java中记录上次访问时间和上次修改时间?首先,让我们关注这些事物的含义.访问–上次读取文件的时间,即上次访问文件数据的时间.修改–上次修改文件(内容已被修改),即文件数据上次修改的时间.更改–文件的元数据的最后一次更改(例如,权限),即上次更改文件状态的时间.编辑.访问时间正在改变.我建议你使用Thread.sleep(100)或其他东西,然后看看这个问题是否仍然存在.如果是这样,罪魁祸首就必须是您正在运行的操作系统,因为J…

    2022年7月8日
    20
  • navicat15.0.23.0激活码【2021.10最新】

    (navicat15.0.23.0激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsa…

    2022年3月27日
    60
  • 秒懂约瑟夫环

    秒懂约瑟夫环转自:https://blog.csdn.net/byn12345/article/details/79487253约瑟夫生者死者游戏约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载,加上风浪大作,危险万分。因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海…

    2022年6月4日
    31
  • .vue文件结构(vue框架项目)

    build文件夹里面是对webpack开发和打包的相关设置,包括入口文件、输出文件、使用的模块等;build.js文件构建环境下的配置:loading动画、删除创建目标文件夹、webpack编译、输出信息’usestrict’//js的严格模式require(‘./check-versions’)()//node和npm的版本检查process.env.NODE_ENV…

    2022年4月12日
    105
  • nginx的负载均衡算法_redis负载均衡

    nginx的负载均衡算法_redis负载均衡1、轮询     就是按照时间顺序分配下一个请求的服务器。2、权值轮询     给每一个服务器加上权值,权值和分配的请求成正比,比较适应于服务器配置不均的情况。3、ip哈希     根据ip的哈希值分配,这样每个ip每次访问的服务器都相同,这样session的处理会容易些。4、响应时间动态分配   根据请求的响应时间来分配,时间越短,说明处理能力较强,这样会…

    2022年10月12日
    2

发表回复

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

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