def _do_close(self): _logger.debug('%s, _do_close', str(self)) if self._error: self._stop_sending() self.stop_receiving() if self._close_ev is None: self._close_ev = Event.add_timer(0) self._close_ev.set_handler(lambda ev: self._on_close())
def _on_send(self): _logger.debug('%s, _on_send', str(self)) if self._fin_sent: self._stop_sending() if self._fin_received: self._do_close() else: self.start_receiving() assert(self._fin_ev is None) _logger.debug('%s, add fin wait timer', str(self)) self._fin_ev = Event.add_timer(FIN_WAIT_TIMEOUT) self._fin_ev.set_handler(lambda ev: self._wait_fin_timeout()) return sent_bytes = 0 ready_to_send = True while len(self._to_send) > 0: data, addr = self._to_send.popleft() if data is None: left = len(self._to_send) if left != 0: _logger.warning('%s, discard %d packages', str(self), left) self._to_send.clear() self._to_send_bytes = 0 self._shutdown() return try: sent = self._send(data, addr) sent_bytes += sent self._to_send_bytes -= sent if sent < len(data): self._to_send.appendleft((data[sent:], addr)) except self._errorType as msg: self._to_send.appendleft((data, addr)) if msg.errno != errno.EAGAIN and msg.errno != errno.EINPROGRESS: _logger.warning('%s, send(%d): %s', str(self), msg.errno, msg.strerror) self._error = True self._do_close() return else: ready_to_send = False break _logger.debug("%s, sent %d bytes", str(self), sent_bytes) if len(self._to_send) == 0: self._stop_sending() self._to_send_or_not(ready_to_send)
def connect(self, addr, port): _logger.debug('connect') if self.is_closed(): return self._wev.set_handler(lambda ev: self._check_connected()) try: _logger.debug('connecting to %s:%d', addr, port) self._fd.connect((addr, port)) except socket.error as msg: if msg.errno != errno.EAGAIN and msg.errno != errno.EINPROGRESS: _logger.error('fd: %d, connect: %s', self._fd.fileno(), os.strerror(msg.errno)) self._error = True self._do_close() else: Event.addEvent(self._wev) else: timer = Event.add_timer(0) timer.set_handler(lambda ev: self._wev.get_handler()(self._wev))
def _enable_heartbeat(self): self._hb_event = Event.add_timer(HEARTBEAT_INTERVAL) self._hb_event.set_handler(lambda ev: self._send_heartbeat())