dadongleilei 发表于 2012-5-16 13:31:43

linux下socket的send函数返回值的问题

如题,在linux系统下,建立tcp的socket以后,发送数据用send函数,但是现在有一个应用提出这样的问题,就是能不能保证send发送后,数据成功送出;现在我做的测试结果是send虽然返回了成功,但是有时未必真正发送成功,最好能够得到tcp的确认,但我查找了应用程序库里好像没有这样的函数,必须在驱动里改吗

albert_w 发表于 2012-5-16 14:03:42

会自己重发吧,不用应用层关心这个的.除非连接断开了

dadongleilei 发表于 2012-5-16 15:36:03

不会自己重发的,现在我是应用层采用心跳确认机制来保证网络可靠性,但是有的客户希望不用回复心跳最好,那么我发送出去的包如果能够检测到tcp的确认是最理想的,现在没找到类似的函数

dadongleilei 发表于 2012-5-16 15:38:29

对了补充一句,就是防止连接异常断开的,比如 服务器突然拔掉网线,类似这种的情况,socket的recv函数不会立即检测到的,

catch2000 发表于 2012-5-16 19:03:22

dadongleilei 发表于 2012-5-16 15:38 static/image/common/back.gif
对了补充一句,就是防止连接异常断开的,比如 服务器突然拔掉网线,类似这种的情况,socket的recv函数不会 ...

突然断开的情况,
有一些延时检测到,应该是可以接受的。

毕竟send后,
都是其它层来处理了,
如果加心跳,相当于要应用层来处理了,
这会不会有些乱呢?

dadongleilei 发表于 2012-5-17 09:07:31

我现在的机制就是应用层来加心跳检测,否则有时明明已经断开了,但是不会马上收到这个事件,有时要好几分钟才能检测到,这对一些要求实时在线的客户 是不大好接受的

kelp 发表于 2012-5-17 11:02:43

可以用Select检测Error和Read事件, 如果Read为0,表示连接断开,Error出现也表示连接断开

dadongleilei 发表于 2012-5-17 12:27:32

恩 我现在是用select来做的,但是这个遇到网络突然断开这样的类似情况,不是马上就能给出提示,这是有数据send的话,函数返回是发送成功了,但是实际上数据丢掉了;
页: [1]
查看完整版本: linux下socket的send函数返回值的问题