Как исправить «[Errno 98] адрес уже используется» в Python - PullRequest
1 голос
/ 13 июня 2019

Я использую DreamHost в качестве хост-провайдера для моего server.py. Если я запускаю свой код локально, функция setsockopt успешно устанавливает для параметра SOCKET_REUSEADDR значение True, и я могу эффективно использовать порт. Но когда я запускаю server.py на хостинге, я получаю ошибку «[Errno 98] Используемый адрес» *

Запуск `ps aux | grep python 'и ручное закрытие процессов с помощью kill -9 PID дает мне возможность повторно использовать порт в начале. Но разве это не значит, что «socket.setsockopt» не работает?

server.py

host = 'Dreamhost_IP'
port = 33000
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_socket.bind((host,port))

.
.
.
.
.

if __name__=="__main__":
    server_socket.listen(5)
    print('waitin for connections')
    accept_thread = threading.Thread(target = accept_connections)
    accept_thread.start()
    accept_thread.join()
    server_socket.close()

I'm expecting to be able to reuse the desired port by overriding the wait time with SO_REUSEADDR. If I use '127.0.0.1' as 'host' and 33000 as 'port', I can successfully rerun the server on that port.

1 Ответ

1 голос
/ 13 июня 2019

SO_REUSEADDR не позволяет связывать две вещи с одним и тем же портом одновременно. Его основная функция - обойти период ожидания после выключения сокета. Если вы хотите связать две вещи одновременно, вам нужно использовать что-то более сильное: SO_REUSEPORT.

...