- 论坛徽章:
- 0
|
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的返回值来判断. 不知道各位还有没有什么其它的好方法?
望指教.
谢谢. |
最佳答案
查看完整内容
TCP流可以保证快速.你发了1K, 等待确认, 那流量就受大影响了.设置超时, 不断发, 直到write出错或超过时间限制.这样可以充分利用TCP流的速度. 网络大部分时间是通的,断的时候是少数.例子,SMTP发送邮件就是如此. 你不能发1K,就等待回应, 确认后再发1K,... 那速度就十分慢了.SMTP发邮件内容时候,就是不断发, 直到最后发完,或出错误,或TIMEOUT. http://bbs.chinaunix.net/viewthread.php?tid=1024366&highlight=%CB%BC%D2%BB%BF%CB从北 ...
|