如何让Socket Send的数据立即发送,并获得回应?

postbeerliu 2003-12-03 09:08:10
为了确保在网络故障的情况下,比如网线拔出了,程序能立即检测到网络不通。
我设想每次send 都让数据立即发送到网络上去,而不在系统发送缓冲区里等待。同时对方收到数据后立即确认。这样如果网线拔掉后数据将发送不出去,或者收不到回应。在现有的socket API下能否通过改变socket的选项来实现?(环境是RedHat Linux,以太网)。windows好象拔掉网线立即就检测到了
...全文
2325 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fierygnu 2003-12-04
  • 打赏
  • 举报
回复
TCP因为有流控和Nagle算法,所以要缓存。流控是无法避免的,跟网络有关。可做的是禁止Nagle算法,用setsockopt设置TCP_NODELAY选项。
拔掉网线就检测到是网卡驱动的功能。但因为网络故障可能发生在任何位置,所以TCP不会中断连接(否则TCP就无法使用了)。TCP_KEEPALIVE是一个方法,不过时间太久,一般为7200s。所以好的办法仍然是用heartbeat,当然做到立即是不可能的,网络延时等等元素必须考虑在内。
sdj 2003-12-04
  • 打赏
  • 举报
回复
实际数据的发送应该没法直接控制吧!即使TCPIP的数据已经提交,第二层协议要分析传输媒体是否可用,如果可以传输就发送,否则就要等待.
用select函数,
设置超时时间.如果socket就绪就send数据,如果send返回的字节与期望发送的字节数不一样
就判断超时时间是否到达,到达了就返回发送失败,否则在剩下的时间内继续发送.这样可以保证你的数据在全部提交后正确返回.
blh 2003-12-03
  • 打赏
  • 举报
回复
现有TCP/IP协议栈只提供传输的可靠保证,并不提供应用的事务处理数据的可靠性保证,对于事务可靠性保证需要应用自己完成(可以使用接收确认+重发机制+心跳检测)
linaxing 2003-12-03
  • 打赏
  • 举报
回复
写一个心搏函数。
参见《unix网络编程》卷一,第21章,带外数据。
postbeerliu 2003-12-03
  • 打赏
  • 举报
回复
请问具体该怎么实现呢?
Fireox 2003-12-03
  • 打赏
  • 举报
回复
检测是可以,但我设想每次send 都让数据立即发送到网络上去不太好吧
postbeerliu 2003-12-03
  • 打赏
  • 举报
回复
我觉得心跳函数确实可以检测到网络连接断掉,
但已经送入系统发送缓冲区的数据还是丢失了?
回到原来的问题上,有没有选项可以让数据一进入缓冲就立即发送出去?

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧