WSAEventSelect使用FD_ACCEPT,recv返回WSAEWOULDBLOCK

时间:2010-10-03 10:37:25

标签: python winapi

我正在尝试使用以下代码设置一个不会在accept(...)上阻塞的套接字:

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 :(得分:0)

通过以下方式解决此问题:在accept之前添加以下行:

win32file.WSAEventSelect(sock.fileno(), event, 0)
sock.setblocking(1)