smtpd.SMTPServer socket.error: (98, 'Address already in use'

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Hatte das schonmal kurz angesprochen: habe einen simplen SMTP-Server. Beim Starten kommt derzeit immer
[…]
File "/usr/lib/python2.5/smtpd.py", line 280, in __init__
self.bind(localaddr)
File "/usr/lib/python2.5/asyncore.py", line 303, in bind
return self.socket.bind(addr)
File "<string>", line 1, in bind
socket.error: (98, 'Address already in use')
Mir wurde empfohlen asyncore.dispatcher.set_reuse_addr() zu verwenden. Das Ganze endete in einer Endlosschleife. Weitere Forschungen ergaben, dass smtpd.SMTPServer bereits set_reuse_addr() benutzt, bevor bind() aufgerufen wird. Hab meinen überflüssigen Aufruf also wieder entfernt und der alte Fehler kommt nun wieder :(

Modul smtpd, Zeilen 272 bis 285:

Code: Alles auswählen

class SMTPServer(asyncore.dispatcher):
    def __init__(self, localaddr, remoteaddr):
        self._localaddr = localaddr
        self._remoteaddr = remoteaddr
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        # try to re-use a server port if possible
        self.set_reuse_addr()
        self.bind(localaddr)
        self.listen(5)
        print >> DEBUGSTREAM, \
              '%s started at %s\n\tLocal addr: %s\n\tRemote addr:%s' % (
            self.__class__.__name__, time.ctime(time.time()),
            localaddr, remoteaddr)
In Zeile 280 kracht es laut dem Traceback (im Code-Snippet entspricht das Zeile 9). Wie man deutlich sieht, findet eine Zeile vorher set_reuse_addr() statt.

Wieso kommt der Fehler trotzdem? Und: Wie kann ich das lösen?
Antworten