免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9169 | 回复: 10
打印 上一主题 下一主题

[Linux] socket编程网络中断情况下如何确保发送缓冲区数据不丢失? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-04 11:30 |只看该作者 |倒序浏览
socket编程网络中断情况下如何确保发送缓冲区数据不丢失?

客户端:嵌入式arm板linux系统
服务器:PC机
网络环境: 电信3G (ppp拨号)

问题: 由于3G信号不稳定,经常遇到网络中断情况,当网络恢复后IP已改变,原socket连接中 客户端发送的数据仍有一部分数据在TCP发送缓冲区中,
         当信号恢复后重新建立连接,但在发送缓冲区的数据会丢失。

请问大神们,有没有什么方法保证数据不丢失? 谢谢!

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
2 [报告]
发表于 2015-06-06 18:21 |只看该作者
保存在数据库里,或者写入一个文件中,是否可以?

论坛徽章:
0
3 [报告]
发表于 2015-06-08 11:09 |只看该作者
不是应用层没发出去的数据,应用层已经有自己的缓冲区,但是在socket断开时,TCP/IP协议栈也有一个缓冲区,没发出去的数据会先存在这里,重新建立连接,如何保证这一部分数据不丢失呢??

论坛徽章:
0
4 [报告]
发表于 2015-07-02 21:21 |只看该作者
send后检查是否发送成功了吗?

论坛徽章:
6
2015年迎新春徽章
日期:2015-03-04 10:16:53操作系统版块每日发帖之星
日期:2015-08-04 06:20:002015亚冠之鹿岛鹿角
日期:2015-08-05 16:51:182015亚冠之全北现代
日期:2015-08-07 17:14:392015亚冠之武里南联
日期:2015-08-11 15:33:03数据库技术版块每日发帖之星
日期:2016-02-02 06:20:00
5 [报告]
发表于 2015-07-20 15:06 |只看该作者
具体不太清楚,应该可以参考tcp在应用层的实现原理,看tcp是如何处理的

论坛徽章:
0
6 [报告]
发表于 2015-07-20 16:28 |只看该作者
BsiIce 发表于 2015-07-02 21:21
send后检查是否发送成功了吗?

赞同,客户端改改程序对发送是否成功进行检查应该有帮助。
我send后查返回的发送字节数但是没有试过连接断开的情况,像这种极端要重新连接的情况估计超出了TCP/IP的处理能力,不妨改程序吧,参考下断线续传的做法,重新连接后查询服务器端数据长度,然后接着发送后续数据吧

论坛徽章:
0
7 [报告]
发表于 2015-07-24 20:37 |只看该作者
tcp协议栈保证数据在对方接受到并且返回了ack后才会删除缓存区数据的

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2015-08-05 17:27 |只看该作者
socket没有了,对应缓冲区应该就没有了吧

应用层既然有缓冲,那么就应用层再实现一遍ack咯

论坛徽章:
0
9 [报告]
发表于 2015-12-04 20:14 |只看该作者
最好有一个发送到发送缓存的拷贝   然后使用应用级别的ACK

论坛徽章:
0
10 [报告]
发表于 2016-01-18 09:27 |只看该作者
两个问题:
1,send返回值代表什么?是已经copy系统的协议缓冲区,还是说系统已经成功发送出去,或者已经收到ack了?
2,如果是仅仅拷贝到系统缓冲区,那你重连之后,这个缓冲区是否还会保留,即便保留,连接的2端该如何共同面对这个问题?

但我觉得socket的实现不应该这么渣,你最好做个数据发送接收的测试,看看在这种情况下双方实际收发的数据再做决定。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP