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


相关推荐

  • 读书笔记–互联网必读《长尾理论》作者克里斯.安德森[通俗易懂]

    读书笔记–互联网必读《长尾理论》作者克里斯.安德森

    2022年1月24日
    427
  • bs模型和cs模型「建议收藏」

    bs模型和cs模型「建议收藏」 bs模式客户端通过浏览器,浏览web服务器上的网页,这样的模型叫bs模型,b指客户端browser,s指服务端server。在客户端和浏览器端之间走的报文是http协议(即超文本传输协议) cs模型客户端(client)发报文,服务器(server)收报文,服务器收到报文之后处理。这与bs模式没有很大区别,只不过是c与s间可以自定义数据传送报文。cs模式一般走的协议是t…

    2022年10月8日
    4
  • Eclipse配置tomcat[通俗易懂]

    1.打开Eclipse,Window–>Preference–>Server–>RuntimeEnvironments2.点击Add,选择相应的tomcat版本,本文以tomcat-8.0.53为例3.选择ApacheTomcatv8.0,点击Next4.配置好Tomcat名和Tomcat路径,点击finish5.在Eclipse控制台…

    2022年4月8日
    41
  • pytest skipif_pytest conftest.py文件

    pytest skipif_pytest conftest.py文件前言pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能Skip和xfail:处理那些不会成功的测试用例你可以对那些在某些特定平台上不能运行的测试用

    2022年7月30日
    10
  • tasklist 结束进程_转Tasklist(windows)

    tasklist 结束进程_转Tasklist(windows)目录Tasklist简述1、”Tasklist”命令是一个用来显示运行在本地或远程计算机上的所有进程的命令行工具,带有多个执行参数。类似Linux系统的ps命令2、显示结果由五部分组成:映像名称(进程名)、PID、会话名、会话#、内存使用使用格式tasklist[/s[/u[\][/p]]][{/m|/svc|/v}][/fo{table|list|csv}…

    2025年6月11日
    6
  • ideaIU-2021.12.13 激活码【中文破解版】

    (ideaIU-2021.12.13 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
    54

发表回复

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

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