是很有可能的,网络不好的情况下 ,即使socket 不关,对方也有可能收不到数据

解决方案 »

  1.   

    有可能。
    在建立连接的时候,socket有一个linger选项,如果这个选项被某一方置为“设置”状态,在调用关闭网络连接方法的时候,OS会将socket粗暴的关闭,而不管发出的数据包的ack是否已经回来,也就是说,不管对方是否已经接收到这个数据包,网络连接都会直接断开,所有相关资源也会立即被释放。
    如果linger没有“设置”,除了出现异常外,一般不会丢包。一般来讲,如果只是建立了一个“很普通的”连接,既使你调用的关闭连接的方法(甚至程序进程直接退出),在对方接收到数据包之前,链路也不会被OS彻底中断掉。此时,这个连接一般会处于类似于“TIME_WAIT”的状态一段时间。
      

  2.   

    不过,话又说回来,引起丢包的原因是很多的,很难避免。
    所幸,OS在实现TCP协议的时候,都有丢包重传的机制。但是这不是万能的,如果重传了N次都失败的话(N视不同的OS而不同),OS就会告诉应用程序失败(使用同步方式工作的话,一般体现为方法调用失败或异常;使用一步的方式工作的话,一般会触发一个消息,当然,有些语言收到消息后会向应用程序抛出个异常)。