WSAEventSelect与FD_ACCEPT,recv返回WSAEWOULDBLOCK
我正在尝试设置一个不会在接受连接时阻塞的套接字,使用以下代码:
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。
我哪里做错了?
1 个回答
0
这个问题的解决方法是:在 accept
之前添加以下几行代码:
win32file.WSAEventSelect(sock.fileno(), event, 0)
sock.setblocking(1)