gpt4 book ai didi

linux - 使用 MSG_NONBLOCK 和 MSG_WAITALL 接收

转载 作者:IT王子 更新时间:2023-10-29 00:13:02 26 4
gpt4 key购买 nike

我想使用带有非阻塞标志 MSG_NONBLOCK 的 recv 系统调用。但是有了这个标志,系统调用可以在完全请求得到满足之前返回。所以,

  • 我可以添加 MSG_WAITALL 标志吗?它会是非阻塞的吗?
  • 或者我应该如何将阻塞 recv 重写到具有非阻塞 recv 的循环中

最佳答案

至少对于 Linux 上的 IPv4 TCP 接收,如果指定了 MSG_NONBLOCK(或文件描述符设置为非阻塞),则忽略 MSG_WAITALL。

来自Linux内核net/ipv4/tcp.c中的tcp_recvmsg():

if (copied >= target && !sk->sk_backlog.tail)
break;

if (copied) {
if (sk->sk_err ||
sk->sk_state == TCP_CLOSE ||
(sk->sk_shutdown & RCV_SHUTDOWN) ||
!timeo ||
signal_pending(current))
break;

如果指定了 MSG_DONTWAIT,则此转换中的目标设置为请求的大小,否则设置为某个更小的值(至少为 1)。如果出现以下情况,该功能将完成:

  1. 已复制足够的字节数
  2. 套接字错误
  3. 套接字已关闭或关闭
  4. timeo 为 0(socket 设置为非阻塞)
  5. 进程有待处理的信号

对我来说,这似乎是 Linux 中的一个错误,但无论哪种方式,它都不会按照您想要的方式工作。看起来 dec-vt100 的解决方案可以,但是如果您尝试在多个进程或线程中从同一个套接字接收数据,则会出现竞争条件。
也就是说,另一个线程/进程可能会调用 recv()在您的线程执行了一次查看后发生,导致您的线程在第二个 recv() 上阻塞。

关于linux - 使用 MSG_NONBLOCK 和 MSG_WAITALL 接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2943434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com