mirror of
https://github.com/beyondx/Notes.git
synced 2026-02-04 02:43:32 +08:00
18 lines
1.8 KiB
Plaintext
18 lines
1.8 KiB
Plaintext
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,当然做到立即是不可能的,网络延时等等元素必须考虑在内。
|