SocketServer.ThreadingTCPServer - Невозможно выполнить привязку к адресу после перезапуска программы - PullRequest
10 голосов
/ 16 февраля 2010

Как продолжение невозможность привязки к адресу после сокета-программы-сбоев , я получал эту ошибку после перезапуска программы:

socket.error: [Errno 98] Адрес уже используется

В данном конкретном случае вместо непосредственного использования сокета программа запускает собственный многопоточный TCP-сервер:

httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler)
httpd.serve_forever()

Как я могу исправить это сообщение об ошибке?

Ответы [ 2 ]

16 голосов
/ 29 июня 2010

Приведенное выше решение не сработало для меня, но сработало:

   SocketServer.ThreadingTCPServer.allow_reuse_address = True
   server = SocketServer.ThreadingTCPServer(("localhost", port), CustomHandler)
   server.serve_forever()
11 голосов
/ 16 февраля 2010

В этом конкретном случае .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) может вызываться из класса TCPServer, когда установлена ​​опция allow_reuse_address. Так что я смог решить это следующим образом:

httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler, False) # Do not automatically bind
httpd.allow_reuse_address = True # Prevent 'cannot bind to address' errors on restart
httpd.server_bind()     # Manually bind, to support allow_reuse_address
httpd.server_activate() # (see above comment)
httpd.serve_forever()

Во всяком случае, подумал, что это может быть полезно. Решение будет немного отличаться в Python 3.0

...