什么会导致 sock send() 命令出现“资源暂时不可用”

新手上路,请多包涵

什么会导致 Resource temporarily unavailable 套接字错误 send() 命令?套接字设置为 AF_UNIX, SOCK_STREAM 。它大部分时间都有效,但偶尔会出现此错误。套接字的接收端似乎工作正常。

我知道这不是很详细,但我只是在寻找一般的想法。谢谢!

原文由 giroy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

"Resource temporarily unavailable" 是对应于 EAGAIN 的错误信息,这意味着该操作将被阻塞但请求了非阻塞操作。对于 send() ,这可能是由于以下任何原因:

  • 使用 fcntl() 显式地将文件描述符标记为非阻塞;或者
  • MSG_DONTWAIT 标志传递给 send() ;或者
  • 使用 SO_SNDTIMEO 套接字选项设置发送超时。

原文由 caf 发布,翻译遵循 CC BY-SA 3.0 许可协议

那是因为您使用的是 non-blocking 套接字并且输出缓冲区已满。

来自 send() 手册页

   When the message does not fit into  the  send  buffer  of  the  socket,
   send() normally blocks, unless the socket has been placed in non-block-
   ing I/O mode.  In non-blocking mode it  would  return  EAGAIN  in  this
   case.

EAGAIN 是与 “资源暂时不可用” 相关的错误代码

考虑使用 select() 来更好地控制这种行为

原文由 Davide Berra 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题