【问题标题】:AttributeError: module 'socket' has no attribute 'MSG_DONTWAIT'AttributeError:模块 'socket' 没有属性 'MSG_DONTWAIT'
【发布时间】:2019-01-07 09:00:08
【问题描述】:

我正在尝试在以下 python 代码中使用标志“MSG_DONTWAIT”:

RECV_BUFFER_SIZE = 1024
buff = memoryview(bytearray(RECV_BUFFER_SIZE))
x = client_socket.recv_into(buff, RECV_BUFFER_SIZE, socket.MSG_DONTWAIT)

我只是从套接字读取。

奇怪的是,当我使用 'MSG_WAITALL' 标志时,代码可以正常工作,但是它失败并出现以下错误:

x = client_socket.recv_into(buff, RECV_BUFFER_SIZE, socket.MSG_DONTWAIT)

AttributeError: 模块 'socket' 没有属性 'MSG_DONTWAIT'

当我尝试使用存在 'MSG_WAITALL' 的同一类 MsgFlag 中的 'MSG_DONTWAIT' 时。我在 Windows 平台上运行它。

【问题讨论】:

  • 可能是平台特定的,你是不是碰巧在 Windows 上?
  • 是的,在 Windows 上运行它!
  • 可能是 fluent 的版本问题。 github.com/fluent/fluent-logger-python/issues/129
  • 如何在我的系统上更新它?我记得两天前我刚刚在我的系统上安装了最新版本的 python!
  • 正如@bgse 假设的那样,它是特定于平台的。 WinSock 没有实现该常量,因此它在 Windows 安装的 Python 套接字包中不可用。

标签: python python-3.x windows


【解决方案1】:

您收到错误是因为MSG_DONTWAIT 未在 Windows 的 Python 套接字模块中定义。 Python 只是作为底层套接字系统的一个小包装器,它是 Windows 上的 Winsock2。特别是 MSG_DONTWAIT 似乎没有被 Posix 定义,并且在 Winsock 中也不存在。在 Unix 或 BSD 系统上,它将在 Python socket 模块中定义,我刚刚在 FreeBSD 10 系统上进行了控制。

根据this other SO question,在阅读了相关的post之后,我认为你必须在Windows上明确地将套接字置于非阻塞模式:

RECV_BUFFER_SIZE = 1024
buff = memoryview(bytearray(RECV_BUFFER_SIZE))
client_socket.setblocking(0)                   # put socket in non blocking mode
try:                                           # a BlockingIOError is raised if nothing is available
    x = client_socket.recv_into(buff, RECV_BUFFER_SIZE, 0)
except BlockingIOError:
    x = 0

【讨论】:

  • 感谢您向我介绍 setblocking() 函数,我现在使用 client_socket.setblocking(True) 和 client_socket.settimeout(3) 的组合等待 3 秒,直到我们收到来自切断!
猜你喜欢
  • 2021-10-21
  • 2016-11-19
  • 1970-01-01
  • 2019-04-02
  • 2018-04-14
  • 2019-02-18
  • 1970-01-01
  • 2020-01-01
  • 2013-05-02
相关资源
最近更新 更多