#python #sockets
#python #сокеты
Вопрос:
Я играю с программным обеспечением shadowsocks и пытаюсь заставить работать функцию автоматического добавления и удаления, она работает нормально, но при следующем вызове я получаю сообщение об ошибке socket.error: [Errno 98] Address already in use
import socket
cli = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
cli.bind('/tmp/client.sock') # address of the client
cli.connect('/var/run/shadowsocks-manager.sock') # address of Shadowsocks manager
cli.send(b'ping')
print(cli.recv(1506)) # You'll receive 'pong'
cli.send(b'add: {"server_port":8001, "password":"7cd308cc059"}')
print(cli.recv(1506)) # You'll receive 'ok'
Можно ли заставить его закрыть сокет или заставить его повторно использовать существующий?
Ответ №1:
Я не думаю, что запрашивающий хотел бы удалить сокет сервера, только сокет клиента.
С консоли этого должно быть достаточно:
rm /tmp/client.sock
Но вы также можете сделать это автоматически в верхней части скрипта:
import os
if os.path.exists('/tmp/client.sock'):
os.remove('/tmp/client.sock')
Соответствующая проблема с Github
Улучшенная реализация позволила бы:
- Каждый раз создавайте уникальный файл сокета (например
/tmp/ssclient.sock.$PID
) - Используйте
try - finally
так, чтобы он всегда удалял / разблокировал файл по завершении процесса.
Ответ №2:
попробуйте использовать нижеприведенную оболочку из терминала
rm -rf /var/run/shadowsocks-manager.sock /tmp/client.sock
Комментарии:
1. удаление файла sock закроет связанный сокет