这里的原子性是指,假如我要发送100个字节的数据给对端,要么把100个字节的数据都写入到tcp缓存返回100,要么一个都不写入返回-1。而不会出现返回50的情况。最近看了下linux插口层的一些源码,发现在sendit函数中有如下的语句
if(error = sosend((struct socket *)fp->f_data, to, &auio, (struct mbuf *)0, control, flags)) {
if(auio.uio_resid != len && (error == ERESTART || error == EINTR || eror ==EWOULDBLOCK))
error = 0;
if(error == EPIPE)
psignal(p, SIGPIPE);
}
if(error == 0)
*retsize = len - auio.uio_resid;
bad:
if(to) m_freem(to);
return error;
从这段代码来看应该是不保证原子性的。
代码具体的含义就不解释了,相信论坛的许多大牛都是研究过的。
tcp是streaming的方式,你所谓的原子性是没法保证的。另外,假设你放了100B数据到缓冲,而这100B被分成2个segment发出去,第一个发出去之后,你的网络断掉了,第二个依旧无法成功重发。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。