【问题标题】:WSAEventSelect with FD_ACCEPT, recv returns WSAEWOULDBLOCK带有 FD_ACCEPT 的 WSAEventSelect,recv 返回 WSAEWOULDBLOCK
【发布时间】: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。

我做错了什么?

【问题讨论】:

    标签: python winapi


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 2021-02-12
      • 2011-07-13
      相关资源
      最近更新 更多