(self, listener)
| 547 | return self._register(ov, conn, self.finish_socket_func) |
| 548 | |
| 549 | def accept(self, listener): |
| 550 | self._register_with_iocp(listener) |
| 551 | conn = self._get_accept_socket(listener.family) |
| 552 | ov = _overlapped.Overlapped(NULL) |
| 553 | ov.AcceptEx(listener.fileno(), conn.fileno()) |
| 554 | |
| 555 | def finish_accept(trans, key, ov): |
| 556 | ov.getresult() |
| 557 | # Use SO_UPDATE_ACCEPT_CONTEXT so getsockname() etc work. |
| 558 | buf = struct.pack('@P', listener.fileno()) |
| 559 | conn.setsockopt(socket.SOL_SOCKET, |
| 560 | _overlapped.SO_UPDATE_ACCEPT_CONTEXT, buf) |
| 561 | conn.settimeout(listener.gettimeout()) |
| 562 | return conn, conn.getpeername() |
| 563 | |
| 564 | async def accept_coro(future, conn): |
| 565 | # Coroutine closing the accept socket if the future is cancelled |
| 566 | try: |
| 567 | await future |
| 568 | except exceptions.CancelledError: |
| 569 | conn.close() |
| 570 | raise |
| 571 | |
| 572 | future = self._register(ov, listener, finish_accept) |
| 573 | coro = accept_coro(future, conn) |
| 574 | tasks.ensure_future(coro, loop=self._loop) |
| 575 | return future |
| 576 | |
| 577 | def connect(self, conn, address): |
| 578 | if conn.type == socket.SOCK_DGRAM: |
no test coverage detected