WSAEventSelect与FD_ACCEPT,recv返回WSAEWOULDBLOCK

0 投票
1 回答
664 浏览
提问于 2025-04-16 04:55

我正在尝试设置一个不会在接受连接时阻塞的套接字,使用以下代码:

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)

撰写回答