开发者社区> 问答> 正文

linux中tcp的send调用能够保证原子性吗?

这里的原子性是指,假如我要发送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;

从这段代码来看应该是不保证原子性的。

代码具体的含义就不解释了,相信论坛的许多大牛都是研究过的。

展开
收起
a123456678 2016-06-15 15:33:22 2375 0
1 条回答
写回答
取消 提交回答
  • tcp是streaming的方式,你所谓的原子性是没法保证的。另外,假设你放了100B数据到缓冲,而这100B被分成2个segment发出去,第一个发出去之后,你的网络断掉了,第二个依旧无法成功重发。

    2019-07-17 19:39:26
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
相关产品:
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载