【问题标题】:Why is there no flag like MSG_WAITALL for send?为什么没有像 MSG_WAITALL 这样的标志用于发送?
【发布时间】:2017-05-29 11:02:50
【问题描述】:

标志MSG_WAITALL 可用于recv,它请求recv 阻塞,直到满足完整请求。这意味着recv 将在收到请求的数据(由参数len 指定)之前不会返回,除非发生错误或连接已关闭。

为什么这样的标志也不适用于send?我认为这对于发送非常有用(send 直到调用者想要发送的所有字节都被交给 TCP 发送缓冲区后才会返回)

【问题讨论】:

  • 什么,等对方收到?

标签: sockets send recv


【解决方案1】:

这将是多余的。如果尚未将套接字设置为阻塞模式,则始终可以将其置于阻塞模式,在这种情况下,send() 会阻塞,直到所有数据都传输完毕。

【讨论】:

  • 而 transferred 是指排队到内核的发送队列。
  • 阻塞套接字真的会发送所有数据吗? man 表示 send 返回发送的字节数,这意味着可能会发生其他事情。此外,在这种情况下,不清楚将函数 sendall 像 Ruby 和 Python 这样的语言添加到其套接字模块的目的是什么。
  • @Vovanrock2002 数据将从您的缓冲区传输到其他地方。无法保证(实际上也不可能)接收方会真正“接收”您的数据而不是丢弃它。
  • 这个答案不可能是正确的。出于同样的原因,根本不需要 MSG_WAITALL - 阻塞 recv() 可以在读取所有请求的数据时返回。
  • @pfalcon No. recv() 在没有 MSG_WAITALL 标志的情况下没有此行为。
猜你喜欢
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多