免费注册 查看新帖 |

Chinaunix

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

TCP 编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-23 11:41 |只看该作者 |正序浏览
最近在看TCP/IP ,有一个问题在书上没有找到答案,感谢高手们帮我解惑!!

通过一个例子来描述我的问题

send(socket, buf, 1000,0 ); 书上说内核将buf的内容全部拷贝到套接口的发送缓冲区,send 就返回 1000 , 在应用层,我们就认为此次发送成功。

然而,此时TCP可能并没有将buf的内容发送到对端。如果TCP(TCP只保证可靠的传输,但并不保证100% 送到)发送失败了,应用层也不会知道,这样岂不会误导应用层???
也就是说应用层如果想要知道对端应用层是否真正的收到了数据,还需要在应用层也做一次确认?????

谢谢指点!

[ 本帖最后由 learntolinux 于 2009-5-23 11:55 编辑 ]

论坛徽章:
0
26 [报告]
发表于 2009-06-02 09:35 |只看该作者
原帖由 cwinex 于 2009-5-25 12:37 发表
只要TCP连接不断,底层一定能帮你发送过去。
对于一个TCP连接,你发送完毕以后,要么要收回复,要么要继续发送,从不会什么都不做了吧。
因此TCP连接上的错误,一定能通过随后的read/write获知。


同意,

send调用成功,表示发送数据任务已经成功交于系统了,

至于系统最后是否成功,要看当时情况了,

TCP SOCKET在协议上、原则上是可靠的(在当时环境正常情况下),

在说,即使有错误,后续read/write时应该会知道的。

论坛徽章:
0
25 [报告]
发表于 2009-06-01 16:46 |只看该作者
貌似有点深,学习。

论坛徽章:
0
24 [报告]
发表于 2009-05-25 12:37 |只看该作者
只要TCP连接不断,底层一定能帮你发送过去。
对于一个TCP连接,你发送完毕以后,要么要收回复,要么要继续发送,从不会什么都不做了吧。
因此TCP连接上的错误,一定能通过随后的read/write获知。

论坛徽章:
0
23 [报告]
发表于 2009-05-25 11:27 |只看该作者
好好看看tcp吧,
不是你想的那样,

论坛徽章:
0
22 [报告]
发表于 2009-05-25 10:48 |只看该作者

回复 #20 bobozhang 的帖子

呵呵,小弟的意思是,是否接收到数据是tcp 内部实现的,如果你连这个也否定,也不敢肯定,那tcp这种socket通信,就没办法开发了。
所以小弟认为究成功后是否对方接收到,毫无意思。上层只需知道怎么判断成功,怎么判断出错就行了。
也就是判断send的返回值。socket程序关注点应该是在阻塞非阻塞两种状态,返回值的判断,有几种情况,他们代表什么,该怎么处理上。
至于是否对方收到,那是tcp的事情,不需管理。因为它是tcp,所以我们认为他会保证。要是把这个否定了,或者是不敢相信了,
建议就别用tcp了,直接从ip层或者udp来实现或重写一个让你自己觉得可以信任的你的所谓tcp。

[ 本帖最后由 urapple 于 2009-5-25 10:52 编辑 ]

论坛徽章:
0
21 [报告]
发表于 2009-05-25 09:23 |只看该作者

论坛徽章:
0
20 [报告]
发表于 2009-05-25 09:17 |只看该作者
原帖由 urapple 于 2009-5-25 08:30 发表
不对,阻塞方式tcp send如果返回成功,就是成功了,失败,基本上就是网络出问题了。别管什么发送缓冲还是应用程序。
tcp本身的send就有recv过程,只有收到确认,才会继续发送下面的数据,否则如果发送缓冲满, ...


我觉得有误,不管阻塞还是非阻塞,send或write成功都不代表对方的协议栈已经接收到了我们数据,也不代表我们的数据一定从网口发出去了。

论坛徽章:
0
19 [报告]
发表于 2009-05-25 09:11 |只看该作者
原帖由 benjiam 于 2009-5-24 22:46 发表
其实 还是有很多细节没有仔细研究过

a b 建立连接 3步握手完成

非阻塞模式
a send 100 字节

如果b 没有返回ack 包, 也不返回rst . a 机器的反应。 是返回100 还是阻塞?

返回是等待b 返回ack, 还 ...


我看了一些资料,我理解的是 : 无论阻塞还是非阻塞,a send 100 字节, 压入栈就返回(资料上说拷贝到TCP缓存),这时 100自己有可能还在本端或是发到了对端但是对端还没有返回ack。如不对,请指正!  好像和楼上的观点部分相冲突,呵呵!!

[ 本帖最后由 learntolinux 于 2009-5-25 09:14 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-05-25 08:30 |只看该作者

回复 #8 learntolinux 的帖子

不对,阻塞方式tcp send如果返回成功,就是成功了,失败,基本上就是网络出问题了。别管什么发送缓冲还是应用程序。
tcp本身的send就有recv过程,只有收到确认,才会继续发送下面的数据,否则如果发送缓冲满,send就阻塞住了,不会返回,你的上层程序也会一直等待,直到发送缓冲腾出空间。只不过应用层没有看到。如果把这点否定,就没法再往下开发了。
非阻塞方式tcp send返回成功与否,可真是只是说有没有拷贝到发送缓冲里,所以,一般情况,网络程序刚开始都要设置发送缓冲和接收缓冲,把他们搞大,在搞大 ^_^
非阻塞的发送失败,就要判断下,到底是什么错误了,可能是正常错误,所以非阻塞发送一般都需要循环发送(在发送失败的时候)。
不过,无论阻塞,非阻塞,只要是tcp,他的send都有recv过程,这点毋庸置疑。
这是小弟以往开发网络程序的一点经验。要是不对,还是以tcp协议为准。呵呵。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP