AttributeError:模块“套接字”没有属性“ MSG_DONTWAIT”

时间:2019-01-07 09:00:09

标签: python python-3.x windows

我正在尝试在以下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_DONTWAIT'的同一类 MsgFlag 中的'MSG_WAITALL'时。我正在Windows平台上运行它。

1 个答案:

答案 0 :(得分:2)

您收到错误消息是因为在Windows的Python套接字模块中未定义MSG_DONTWAIT。 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