«Ошибка OS: [Errno 48] Адрес уже используется» при проверке IP-адреса в циклеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 «Ошибка OS: [Errno 48] Адрес уже используется» при проверке IP-адреса в цикле

Сообщение Anonymous »

Я использую пакет Whatismyip для проверки моего IP-адреса перед вызовом API, чувствительного к IP. Код выполняется в цикле, и после нескольких итераций я обнаружил следующую ошибку:

Код: Выделить всё

OSError: [Errno 48] Address already in use
Из некоторых поисков я понял, что это связано с тем, что Whatismyip пытается использовать назначенный порт до того, как он будет освобожден.
Я' Я пытался создать MRE, чтобы воспроизвести ошибку:

Код: Выделить всё

import time
import whatismyip

EXPECTED_IP = "123.123.123.123"

while True:
current_ip_address = whatismyip.whatismyipv4()
if current_ip_address != EXPECTED_IP:
raise Exception
time.sleep(0.1) # simulate accessing IP sensitive API for info A
current_ip_address = whatismyip.whatismyipv4()
if current_ip_address != EXPECTED_IP:
raise Exception
time.sleep(0.1) # simulate accessing IP sensitive API for info B
current_ip_address = whatismyip.whatismyipv4()
if current_ip_address != EXPECTED_IP:
raise Exception
time.sleep(0.1) # simulate accessing IP sensitive API for info C
Однако, к сожалению, он только выплевывает:

Код: Выделить всё

ResourceWarning: unclosed 
Похоже, это связано с моей ошибкой, но не останавливает код.
В реальном коде я пытался перехватить OSError и повторите попытку Whatismyip.whatismyipv4(), но это просто генерирует ту же ошибку.
Ошибка возникает в последней строке этого блока кода, который я извлек из пакет:

Код: Выделить всё

SOURCE_IP = '0.0.0.0'
SOURCE_PORT = 54320

sockObj = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sockObj.settimeout(2)
sockObj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sockObj.bind((SOURCE_IP, SOURCE_PORT))
При поиске решений большинство ответов, например. этот, кажется, рекомендует найти процесс, который использует порт, и убить его. Однако они не предоставляют никакого кода, который я мог бы включить в свой сценарий. В дополнение к этому я наткнулся на этот пост, в котором говорится, что вы не можете заставить ОС закрыть сокет. Затем он рекомендует реализовать тот же код, что уже приведен выше:

Код: Выделить всё

sockObj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Я понимаю, что это не идеальный пост, потому что я не могу воспроизвести ошибку в MRE, но есть ли у кого-нибудь идеи, как это решить?
Я использую Python 3.10.8 в MacOS 13.2.1.

Подробнее здесь: https://stackoverflow.com/questions/761 ... -in-a-loop
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему я получаю сообщение Errno 98: адрес уже используется?
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Почему я получаю сообщение Errno 98: адрес уже используется?
    Anonymous » » в форуме MySql
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Почему я получаю сообщение Errno 98: адрес уже используется?
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Почему я получаю сообщение Errno 98: адрес уже используется?
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Python [Errno 98] Адрес уже используется
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»