TCP Socket 中,有时候拔掉网线后依然能够成功写入数据,怎样快速的触发 发送异常

不懂就别胡扯了,还设计缺陷呢。操作系统怎么处理外边进来的数据流,并且通知你的进程程序?如果你在主机开了10个服务器,监听10个端口,那么同时来10个请求每个服务器一个,操作系统怎么处理这些数据流,并且通知你 10 个进程? 现代操作系统是抢占分时,进程是挨个运行,重复的循环。为了能把数据从内核通知到你的进程,操作系统必须在内部设置缓冲区,把数据流缓存起来,直到填满缓冲区。然后,到你的进程运行的时候,把缓冲区的数据 copy 过去。你去关机,除非拔电源,否则即便使用 shutdown 命令,操作系统也会优雅的关机。所谓优雅就是,完成所有进程正在进行的内部流,并且确定没有内核任务绑定了,才会关机
■网友
【TCP Socket 中,有时候拔掉网线后依然能够成功写入数据,怎样快速的触发 发送异常】 客户端连着路由器,然后路由器的出口网线断掉这种情况,确实是客户端OS和服务端OS都无法立即感知的。因为路由器一般不会给客户端或者服务端发送任何信息。
其实这个设计本身是合理的,否则的话:如果每次出口电路有点异常都通知上下游的话,也是很麻烦的。
解决的方案:合理设计应用的超时机制,不同的应用场景需要不同的超时时间。
举个例子:你可以仔细观察下微信的登录和消息发送。一开始我以为微信客户端会监测本地网络事件,然后快速超时。后来试了几次才知道,微信压根不管客户端的网络断开事件(即使iOS和Android都有这个事件)。在登录过程你即使关掉手机的移动网络和WIFI,登录依然在进行。发消息的时候也是这样,即使完全关掉移动网络和WiFi,微信也一直在尝试发送,直到微信自己设置的超时过了,才会提示用户发送失败。微信这样设计就是贴合微信自己的场景的,这种设计能够保证在网络频繁切换的过程中尽可能的将消息发出去
(IP网络当年也是以尽可能发送消息为目标设计的)。
(但是微信对于CONNECTED事件会更及时响应)。

■网友
可以说是 tcp 协议的设计缺陷
虽然大牛总是会说是你自己技术不到家云云。。。。

一般这种情况都是自己做心跳检测 是最优的方案。(自己规定对方多长时间内无回应即断开连接)
我个人的经验是1-3秒 3秒为宜。网游的话1秒(除非全球服)。

■网友
设个keepalive,可以让协议栈去主动探测
一般关键操作都要求对方回答ack封包,我一般就等几秒超时,不回答ack我就关闭这个套接字再重新建立 异步socket可以自定义超时时间咯

■网友
应用层要求确认 。


    推荐阅读