刚想到一个情况,正好是工作中遇到的。
当服务器停止时,正好有连接的请求正在被处理,而此时服务端需要等待该请求被正常的处理完,然后给客户端发送响应报文。
正常情况下,服务器停止的时候,是希望发送了响应报文之后立即就该关闭该连接(这样最理想)。
但是发现一个问题就是,当服务端发送响应报文后立即关闭连接,那么客户端是否能按正常的顺序先接收完报文然后才是SOCKET 的断开呢?
这个问题我把它放到一个QQ 群里面讨论了一下,大神给出的结果是:SOCKET 在关闭连接的时候,在默认情况下( linger 选项打开),SOCKET 会尝试将缓冲区中的数据先发送到客户端然后发起关闭操作。所以在这一点上,基本是可以保证客户端先读取到数据,然后再接收到关闭SOCKET 连接的FIN 。
同时我也写了代码尝试过,并未出现在数据没接收到的时候就将SOCKET 断开 的情况。这一测试是在公网啊里云服务器与本地主机上进行的,所以网络有一点延迟模拟的比较完善,不至于在本机因为网络太快而导致前后未乱顺的情况。