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


相关推荐

  • 自己写一个jqery的拖拽插件

    自己写一个jqery的拖拽插件

    2021年12月8日
    58
  • 基本稳压电路

    基本稳压电路经过整流后的电源具有较大的电压纹波,单靠调节滤波电容不能明显改善输出电源纹波特性,因此需要采用稳压电路来减小输出电源的纹波。若直将稳压管接至负载输出,则稳压管的工作特性受负载影响较大,甚至会出现不能正常工作的情况。采用下图所示的稳压电路则能保证稳压管始终能够正常工作。其核心思想仍然是负反馈。运放正输入端采用稳压管提供一个相对稳定的基准电压,并通过同相放大在输出端得到一个稳定的输出电压。而由于运放具有一定的电源抑制比,所以在供电电压在一定范围波动时,其仍可正常工作。同向比例运放的输出电流有限,故采用了

    2022年6月20日
    34
  • github最新最快有效host地址

    github最新最快有效host地址github140.82.112.4github.com140.82.113.3gist.github.com185.199.108.153assets-cdn.github.com199.232.68.133raw.githubusercontent.com199.232.68.133gist.githubusercontent.com199.232.68.133cloud.githubusercontent.com151.101.192.133camo.githubuserc

    2022年7月16日
    20
  • 2021-08-08 WPF控件专题 WrapPanel 控件详解[通俗易懂]

    2021-08-08 WPF控件专题 WrapPanel 控件详解[通俗易懂]1.WrapPanel控件介绍流面板子元素按顺序排列,如果按水平方向:从左到右,超出部分,自动换行到下一行垂直从上到下,下一列排列方向:OrientationItemWidthItemHeight调整面板的尺寸时,内部子元素的布局–自动调整弥补StackPanel的不足StackPanel与WrapPanel结合使用2.具体案例<BorderBorderBrush=”Red”BorderTh

    2022年7月23日
    13
  • 电阻的型号命名方法_旺诠电阻命名规则

    电阻的型号命名方法_旺诠电阻命名规则1、5%精度的命名:RS-05K102JT2、1%精度的命名:RS-05K1002FTR-表示电阻S-表示功率0402是1/16W、0603是1/10W、0805是1/8W、1206是1/4W、1210是1/3W、1812是1/2W、2010是3/4W、2512是1W。05-表示尺寸(英寸):02表示0402、03表示0603、05表示0805、06表示1206、1210表示1210、1812表示1812、10表示2010、12表示2512。K-表示温度系数为100PPM,102-5%

    2022年8月21日
    9
  • js解决页面后退

    js解决页面后退在a链接加上下面属性href=”javascript:history.go(-1);”

    2022年7月25日
    5

发表回复

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

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