我正在尝试在以下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平台上运行它。
答案 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