закрыть открытое соединение, чтобы разрешить прохождение следующего вызова

#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 закроет связанный сокет