【发布时间】:2010-10-03 10:37:25
【问题描述】:
我正在尝试使用以下代码设置一个不会在接受(...)上阻塞的套接字:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 1234))
event = win32event.CreateEvent(None, True, False, None)
win32file.WSAEventSelect(sock.fileno(), event, win32file.FD_ACCEPT)
sock.listen(5)
rc = win32event.WaitForSingleObject(event, win32event.INFINITE)
if not rc == win32event.WAIT_OBJECT_0:
return
conn, addr = sock.accept()
while 1:
data = conn.recv(1024)
if not data: break
conn.send(data)
conn.close()
当客户端连接但没有数据时,recv 返回WSAEWOULDBLOCK。阅读 MSDN 解释了这是非阻塞套接字的正确行为,但是当使用 WSAEventSelect 时,我只指定了 FD_ACCEPT,没有指定 FD_READ。因此,我希望recv 在没有数据时阻塞,并在连接正常关闭时返回 0。
我做错了什么?
【问题讨论】: