WSAEventSelect с помощью FD_ACCEPT, recv возвращает WSAEWOULDBLOCK - PullRequest
0 голосов
/ 03 октября 2010

Я пытаюсь настроить сокет, который не будет блокироваться при принятии (...), используя следующий код:

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 голосов
/ 03 октября 2010

Решено путем добавления следующих строк перед accept:

win32file.WSAEventSelect(sock.fileno(), event, 0)
sock.setblocking(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...