免费注册 查看新帖 |

Chinaunix

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

[C] linux下tcp协议的socket可靠传输 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2011-10-21 09:57 |只看该作者
回复 8# yulihua49


    是这个意思,但是牵涉到服务端,这个代码不是我写的,协议也不是我定的,我只是在最小花费下负责收拾烂摊子

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2011-10-21 10:00 |只看该作者
回复 7# samzc2010


    你说的很对,tcp而不是udp,确实是负责这个的,但是注意,tcp不是socket,虽然几乎所有的tcp协议都使用socket来实现,他们仍然不是一回事,无论堵塞也好非堵塞也好,我们的写入操作本身的返回仅能代表放到了socket的发送缓冲,不确保已经成功送达,如果你写一个简单的程序来验证就会发现这一点。
    保证socket的发送缓冲区中数据不丢失,而不是应用程序自己的所谓发送缓冲,是我提出问题和解决问题的目的。

    如果我理解上有偏差,欢迎大家继续指证

论坛徽章:
0
13 [报告]
发表于 2011-10-21 10:09 |只看该作者
个人觉得可能在这点上你的理解有点偏差。建议你在研究下异步SOCKET TCP方式的发送机制。不是这样的,不是说你投递到缓冲就结束了,TCP在数据的传送上有ACK机制保证可靠。这个ACK返回到你的应用程序接口上就是通知你缓冲内的数据已经发送了多少字节。通过这个状态检查你可以知道到底成功发送出去多少数据,还有多少数据未有发送,或者发送失败发生了。

个人意见,仅供参考。
回复  samzc2010


    你说的很对,tcp而不是udp,确实是负责这个的,但是注意,tcp不是socket,虽然几 ...
notsureit 发表于 2011-10-21 10:00

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
14 [报告]
发表于 2011-10-21 10:19 |只看该作者
个人觉得可能在这点上你的理解有点偏差。建议你在研究下异步SOCKET TCP方式的发送机制。不是这样的,不是说 ...
samzc2010 发表于 2011-10-21 10:09


你先研究一下吧

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
15 [报告]
发表于 2011-10-21 10:46 |只看该作者
回复 13# samzc2010


   
这个。。。我只能说最初我也是像你这么想的,后来发现自己理解的不正确,建议你看看堵塞非堵塞的相关文章

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16
发表于 2011-10-21 10:50
回复 13# samzc2010


    这个是一篇相关的文章,你看看:
http://xufish.blogbus.com/logs/40537344.html

论坛徽章:
0
17 [报告]
发表于 2011-10-21 11:09 |只看该作者
那么,可以可否用select试试?这样数据发送失败时,上层应该可以接收到一个错误

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2011-10-21 11:11 |只看该作者
回复 17# Redshadows


    已经这么做了,还是上面提过的,如果缓冲区相对较大,网速相对较慢,那么select报错的时候,并不代表是当前发送出错,仍然需要我之前提到的问题和解决方法。

论坛徽章:
0
19 [报告]
发表于 2011-10-21 14:48 |只看该作者
回复  Redshadows


    已经这么做了,还是上面提过的,如果缓冲区相对较大,网速相对较慢,那么selec ...
notsureit 发表于 2011-10-21 11:11

问一下,如果TCP发送多次失败并停止发送尝试时,TCP发送缓冲区中相应的数据应该会被丢弃掉吧?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2011-10-21 15:15 |只看该作者
回复 19# Redshadows


    这个,我没有看底层代码,不好很确定的答复,但是在没有出现异常的情况下,这部分数据应该不会被丢弃,而应该会不停的被底层进行重试,因为数据本身是无差别的,在通道不存在物理错误的前提下,你不关闭重启,即使是丢弃了,谁又能保证可以就能发送成功那,所以还是应该根据具体的错误代码来做后续的处理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP