def _iocp_recv(self, bufsize, *args):
"""Internal use only; use 'recv' with 'yield' instead.
"""
def _recv(err, n):
if self._timeout and self._notifier:
self._notifier._del_timeout(self)
if err or n == 0:
self._read_overlap.object = self._read_result = None
if not err:
err = winerror.ERROR_CONNECTION_INVALID
if self._read_task:
if (err == winerror.ERROR_CONNECTION_INVALID or
err == winerror.ERROR_OPERATION_ABORTED):
self._read_task._proceed_('')
else:
self._read_task.throw(socket.error(err))
else:
buf = self._read_result[:n]
self._read_overlap.object = self._read_result = None
self._read_task._proceed_(buf)
if not self._scheduler:
self._scheduler = Pycos.scheduler()
self._notifier = self._scheduler._notifier
self._register()
if self._timeout:
self._notifier._add_timeout(self)
self._read_overlap.object = _recv
self._read_result = win32file.AllocateReadBuffer(bufsize)
self._read_task = Pycos.cur_task(self._scheduler)
self._read_task._await_()
err, n = win32file.WSARecv(self._fileno, self._read_result, self._read_overlap, 0)
if err != winerror.ERROR_IO_PENDING and err:
self._read_overlap.object(err, n)
评论列表
文章目录