Files
kernel_Notes/Zim/Programme/APUE/note.txt
2012-08-08 15:17:56 +08:00

18 lines
1.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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当然做到立即是不可能的网络延时等等元素必须考虑在内。