免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: simon_qwl
打印 上一主题 下一主题

关于SOCKET下的数据重发,希望大家能给些思路! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-06-07 13:38 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

原帖由 "flw" 发表:

不错,我们不能要求每个客户都去读 TCP/IP 原理,
所以你就不能跟客户说,“因为我们用的是 TCP/IP,所以我们什么都不需要做”,
而应该说,“我们用的是 TCP/IP 这种可靠的协议,而且即使是网络出了故障,我们还..........


但是就我的理解,TCP/IP只能确保数据的安全到达,但是如果是数据或则应用层面出现的错误,TCP/IP就无能为力了啊,这一部分就因该由应用层自己处理了.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2005-06-07 14:12 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

[quote]原帖由 "simon_qwl"]但是就我的理解,TCP/IP只能确保数据的安全到达,但是如果是数据或则应用层面出现的错误,TCP/IP就无能为力了啊,这一部分就因该由应用层自己处理了.[/quote 发表:

不错,我也是这个意思。

论坛徽章:
0
13 [报告]
发表于 2005-06-07 14:38 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

关于超时重发
1 每发送一条消息,记录下发送时间,并且增加发送计数,放入缓存,
2 定时监控,如果缓存消息超时(如1分钟)就重发,并且修改发送计数
            如果缓存消息超过最大发送次数,就从缓存中删除

关于对方发送的确认包
1 如果在缓存中没有找到对应的包,肯定是超时,并且超过了最大发送次数,已经删除掉了,可以不予处理;如果系统还想处理,就需要从日志中找到对应的包,才能处理;简单的处理方法是对超过最大发送次数的数据包写入特殊的日志,将没有找到对应包的对方发送的数据包存入特殊的日志,在系统外特殊处理一下

关于缓存,请用map,因为他查找对应包的速度比较快哟

我做的工作中有一部分就是这样的

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
14 [报告]
发表于 2005-06-07 15:19 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

我也是这样想的,不过我想用三个线程:
线程1: 从待发缓存区中提取信息包并发送,然后将其放入待确认缓存,但是如果信息包的重发次数变量不等于0,那么就不用此操作!
线程2: 监控待确认缓存中的信息包,如果超时就将信息包放入待发缓存区里,重发次数变量+1
线程3: 监听SOCKET,如果接受到的是确认包,就删除相应的信息包




我觉得第二个线程可以省去,将检查超时的工作放在第三个线程作。
第三个线程可用poll监听,设一个较短时间的等待时间。不管poll的中断
是收到收到有确认包还是超时中断,都对确认缓冲区内的数据包做一下超时检查。
这样做逻辑上比较简单,而且对于砍缓冲区来说,一个线程只管存,一个只管取。比一个线程存,两个线程取要好管理。

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
15 [报告]
发表于 2005-06-07 15:25 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

不好意思,不会引用  第一段话是 simon_qwl 写的。

论坛徽章:
0
16 [报告]
发表于 2005-06-08 00:19 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

原帖由 "mywwwchinaunixnet" 发表:
关于超时重发
1 每发送一条消息,记录下发送时间,并且增加发送计数,放入缓存,
2 定时监控,如果缓存消息超时(如1分钟)就重发,并且修改发送计数
            如果缓存消息超过最大发送次数,就从缓存中删除
..........


非常感谢讲解的这么详细,对于你的方法我还有几个问题不是很清楚,想再请教一下:
1. 对于超时的确认是通过当时的检测时间减去存储的发送时间?
2. 对于定时监控是用专门的一个线程通过SLEEP()之类的还是用SELECT()或POLL()?
3. 呵呵,一个比较弱的问题,你说的MAP是MMAP()吗?
谢谢!

论坛徽章:
0
17 [报告]
发表于 2005-06-08 00:27 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

原帖由 "wxycyel" 发表:
我也是这样想的,不过我想用三个线程:
线程1: 从待发缓存区中提取信息包并发送,然后将其放入待确认缓存,但是如果信息包的重发次数变量不等于0,那么就不用此操作!
线程2: 监控待确认缓存中的信息包,如果超时就将信..........


对,之前我也是这样想的,可是觉得这样分工似乎不时很明确,线程2不但要接受数据包,检测缓存,而且还要发送超时的数据包,你觉得呢 ?

论坛徽章:
0
18 [报告]
发表于 2005-06-08 00:31 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

[quote]原帖由 "wxycyel"]不好意思,不会引用  第一段话是 simon_qwl 写的。[/quote 发表:


呵呵,没关系,以后如果要引用,直接点那条短信右上角的”引用“

论坛徽章:
0
19 [报告]
发表于 2005-06-08 09:16 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

客气了不是,共同学习

1. 对于超时的确认是通过当时的检测时间减去存储的发送时间?
   答:是的
2. 对于定时监控是用专门的一个线程通过SLEEP()之类的还是用SELECT()
或POLL()?
   答:Linux下usleep()可以实现到毫秒级,windows下用Sleep实现到毫秒级
3. 呵呵,一个比较弱的问题,你说的MAP是MMAP()吗?
   map是一种容器,可以根据键值迅速找到键对应的值,例如c++标准库中的map、MFC中的CMap等都实现了,

论坛徽章:
0
20 [报告]
发表于 2005-06-08 09:32 |只看该作者

关于SOCKET下的数据重发,希望大家能给些思路!

看的有点像移动公司的CMPP协议。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP