Esempio n. 1
0
 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())
Esempio n. 2
0
    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)
Esempio n. 3
0
    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))
Esempio n. 4
0
 def _enable_heartbeat(self):
     self._hb_event = Event.add_timer(HEARTBEAT_INTERVAL)
     self._hb_event.set_handler(lambda ev: self._send_heartbeat())