Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-06-02T22:14:44+08:00 ====== note ====== Created 星期四 02 六月 2011 为了确保在网络故障的情况下,比如网线拔出了,程序能立即检测到网络不通。 我设想每次send 都让数据立即发送到网络上去,而不在系统发送缓冲区里等待。同时对方收到数据后立即确认。这样如果网线拔掉后数据将发送不出去,或者收不到回应。在现有的socket API下能否通过改变socket的选项来实现?(环境是RedHat Linux,以太网)。windows好象拔掉网线立即就检测到了 现有TCP/IP协议栈只提供传输的可靠保证,并不提供应用的事务处理数据的可靠性保证,对于事务可靠性保证需要应用自己完成(可以使用接收确认+重发机制+心跳检测) 实际数据的发送应该没法直接控制吧!即使TCPIP的数据已经提交,第二层协议要分析传输媒体是否可用,如果可以传输就发送,否则就要等待. 用select函数, 设置超时时间.如果socket就绪就send数据,如果send返回的字节与期望发送的字节数不一样 就判断超时时间是否到达,到达了就返回发送失败,否则在剩下的时间内继续发送.这样可以保证你的数据在全部提交后正确返回. TCP因为有流控和Nagle算法,所以要缓存。流控是无法避免的,跟网络有关。可做的是禁止Nagle算法,用setsockopt设置TCP_NODELAY选项。 拔掉网线就检测到是网卡驱动的功能。但因为网络故障可能发生在任何位置,所以TCP不会中断连接(否则TCP就无法使用了)。TCP_KEEPALIVE是一个方法,不过时间太久,一般为7200s。所以好的办法仍然是用heartbeat,当然做到立即是不可能的,网络延时等等元素必须考虑在内。