免费注册 查看新帖 |

Chinaunix

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

write socket时的一个疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-22 15:03 |显示全部楼层 |倒序浏览
10可用积分
想请教一下, 我有两台机器在通信, PC1, PC2, 当PC1要向PC2发送数据的时候, 我把PC2的网线断掉, 此时PC1在调用write()的时候, write()会成功返回, 并且返回写入内核的字节数, 但是PC1由于没有收到PC2的ACK包, 会一直重传, 并且在几分钟之后放弃发送数据.

此时如果做如下操作分别有如下对应的结果:

1. PC1继续write, 则write出错, 并且返回没有路由可到达的错误. 断掉socket
2. PC1在write之后就调用read, read会阻塞, 过一会儿read会返回和上面一样的错误,也是路由不可达的错误. 断掉socket.
3. PC1不再管这个socket了, 做其它的事情, 那么我观察了一下, 过了一会儿这个socket就断掉了. 对进程并没有什么影响.

这只是我实验的数据. 我看TCP/IP详解上面也只是讲了重传的算法, 并没有讲如何影响用户态程序的, UNP上也没有讲这种情况, 不知道各位以前对这个有没有什么研究吗?
那么平时编网络程序时应该如何来解决这种问题呢? 我现在也只是在应用层自己制定了一种协议, 即在write之后就调用read, 通过read的返回值来判断. 不知道各位还有没有什么其它的好方法?
望指教.
谢谢.

论坛徽章:
0
2 [报告]
发表于 2007-12-22 15:27 |显示全部楼层

回复 #2 cugb_cat 的帖子

嗯. 我得到的也是这样的结果, 那是不是一般在write之后都应该有一定的检测措施呢. 如read, write.
我写代码的经验不太多, 所以有些遇到的问题还很陌生.

论坛徽章:
0
3 [报告]
发表于 2007-12-22 15:51 |显示全部楼层

回复 #4 converse 的帖子

那你每次轮循的时候是不是会消耗很多的时间啊, 因为你每个client都要去判断一下. 还是每次select返回都只是查看当前描述符的时间?

论坛徽章:
0
4 [报告]
发表于 2007-12-23 10:39 |显示全部楼层
原帖由 xhl 于 2007-12-22 20:35 发表


我没怎么看明白你的 问题, 给你点建议, 也许不是你的问题的 答案。

windows linux 还有部分 unix kernel已经提供了 tcp keepalive的 能力,

你只需要用 setsockopt 设置己个 arg就可以了  keepali ...


谢谢, 我的意思其实就是说如果我在向另一台机器write的时候, 那台机器突然断网了, 所以此时的发送机收不到任何可以提示的信息, 如EOF, RST包之类的, 如果在我write之后我再调用 read 或者是 write的话, 则可以发现这个问题, 但是如果就不再调用 read , write之类的了, 我发送机就根本不能确认我之前那个write是否能够成功到达. 所以为了保证可靠性, 我一般都要再一次的read或者是write以确定一下.
我就是想请教一下, 大家在遇到这种问题的时候是如何处理的.

论坛徽章:
0
5 [报告]
发表于 2007-12-23 10:40 |显示全部楼层
原帖由 思一克 于 2007-12-22 21:50 发表
你这是好方法吗?
不是。速度会慢许多许多。

"那么平时编网络程序时应该如何来解决这种问题呢? 我现在也只是在应用层自己制定了一种协议, 即在write之后就调用read, 通过read的返回值来判断. 不知道各位还有 ...


请版主指教, 我就是把我的想法说出来, 然后再希望得到大家更多的指导. 谢谢!

论坛徽章:
0
6 [报告]
发表于 2007-12-23 14:38 |显示全部楼层

回复 #15 思一克 的帖子

嗯. 谢谢, 这种方法确实是要比我说的那种效率高.

>>直到最后发完,或出错误,或TIMEOUT.
当不断地发送完毕之后也应该会有一个recv之类的操作吧, 以确定是否所有的send都已经成功. 因为如果没有这一步仍然无法确定是否所有的都已成功.

>>2)发送方一般知道一个箱子发车后最长多久一定可以收到上海的收到确认电话.比如一天.如果3天还没有,北京也可以确定路上出问题了.
这一步, 也应该是使用recv来完成的吧. send完了之后没有办法知道是否成功.

总之, 我的看法是, 不管是一次send一次recv还是多次send, 之后总得有一个recv来实现这个可靠的通知.
谢谢指教.

论坛徽章:
0
7 [报告]
发表于 2007-12-23 15:14 |显示全部楼层
原帖由 思一克 于 2007-12-23 15:02 发表
应用层有协议确然。

但不应该是每个write之后确认, 而是多个(几十,几百,数千个)以后确认。
比如你有10M的一个邮件要发,DATA后发送端就不断发了,接受端收到结束标志后,发一个OK类似的话告诉发送端。 ...


明白了, 谢谢!

论坛徽章:
0
8 [报告]
发表于 2007-12-23 15:50 |显示全部楼层
谢谢前面各位的关注, 不过分只能给一位朋友, 以后有机会再补上.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP