免费注册 查看新帖 |

Chinaunix

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

[函数] socket中,send/write成功意味着什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-17 09:42 |只看该作者 |倒序浏览
最近在复习TCP协议,有个问题一直比较困惑,调用send/write并且返回成功意味着什么?目前有争议的两个答案,第一是发送成功代表数据到了本方的协议栈,是否发送到对端尚不可知;第二是数据已经被对端协议栈接受.

我的感觉应该是后者,因为从man 2 send的说明来看,decription的第一句就是:
The system calls send(), sendto(), and sendmsg() are used to transmit a message to another socket.

也就是说,从man中看到对send类函数的说明,语意上是把数据发送到对端,而仅仅把数据保留在本方协议栈是不足以保证数据会发送到对端去的.

不知道其他人怎么看?我仅从man对send函数的语意说明来理解这个问题,有没有其他可以控制的实验结果可以说明问题的?

论坛徽章:
0
2 [报告]
发表于 2008-07-17 09:44 |只看该作者
send仅仅是把数据从用户态发送到内核的网络协议栈中去。我曾经试过,在发送send之前我把网线拔了,但是send仍然成功返回。之后再用tcpdump看的时候发现一直在发送包,最后试了多次失败之后就不发了。但是当下一次再调用send或者read的时候就会再报错的。

论坛徽章:
0
3 [报告]
发表于 2008-07-17 09:45 |只看该作者
http://bbs.chinaunix.net/viewthr ... mp;highlight=scutan
我当时做实验时的讨论在这个贴子中。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-07-17 09:46 |只看该作者
原帖由 converse 于 2008-7-17 09:42 发表
最近在复习TCP协议,有个问题一直比较困惑,调用send/write并且返回成功意味着什么?目前有争议的两个答案,第一是发送成功代表数据到了本方的协议栈,是否发送到对端尚不可知;第二是数据已经被对端协议栈接受.

我 ...


The system calls send(), sendto(), and sendmsg() are used to transmit a message to another socket.

从英文字面意思上看,transmit 只代表发送、传输,应该没有已经发送到的意思。照此理解的话,并不能保证接收端已经接收到数据吧。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2008-07-17 09:47 |只看该作者
原帖由 scutan 于 2008-7-17 09:44 发表
send仅仅是把数据从用户态发送到内核的网络协议栈中去。我曾经试过,在发送send之前我把网线拔了,但是send仍然成功返回。之后再用tcpdump看的时候发现一直在发送包,最后试了多次失败之后就不发了。但是当下一 ...



从字面意思上理解,也应该是这样吧。只是发到本机的网络协议栈了,以后的情况位置。毕竟还有recv函数,这个返回成功相当于接收到了吧。

论坛徽章:
0
6 [报告]
发表于 2008-07-17 09:51 |只看该作者

回复 #5 Godbach 的帖子

嗯,是的。如果send最终没有成功的话,之后的recv也会出错的。

论坛徽章:
0
7 [报告]
发表于 2008-07-17 09:53 |只看该作者
原帖由 Godbach 于 2008-7-17 09:46 发表


The system calls send(), sendto(), and sendmsg() are used to transmit a message to another socket.

从英文字面意思上看,transmit 只代表发送、传输,应该没有已经发送到的意思。照此理解的话,并 ...


没错,是发送,所以这个函数调用成功就应该意味着已经发送到了对方的协议栈了.

论坛徽章:
0
8 [报告]
发表于 2008-07-17 09:54 |只看该作者
等等,我想了一想,我对这个语意的理解有误差,发送成功的意思应该由本方的协议栈发送出去了,而对方是否接受成功不可知.

论坛徽章:
0
9 [报告]
发表于 2008-07-17 09:55 |只看该作者
原帖由 scutan 于 2008-7-17 09:44 发表
send仅仅是把数据从用户态发送到内核的网络协议栈中去。我曾经试过,在发送send之前我把网线拔了,但是send仍然成功返回。之后再用tcpdump看的时候发现一直在发送包,最后试了多次失败之后就不发了。但是当下一 ...

是这样的。

论坛徽章:
0
10 [报告]
发表于 2008-07-17 09:56 |只看该作者
好比你去寄信,这里的发送成功类似于你把信寄出,而对方的地址是不是有变化,是不是接到,还不得而知.

这么解释和理解,这个问题就清楚了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP