循环检查 IP 地址时出现“OSError: [Errno 48] 地址已在使用中”

问题描述 投票:0回答:1

在调用 IP 敏感 API 之前,我使用

whatismyip
包检查我的 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 <socket.socket fd=73, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('0.0.0.0', 54320)>

这看起来与我的错误有关,但不会停止代码。

在实际代码中,我尝试捕获

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))

在寻找解决方案时,大多数答案,例如这个,似乎建议找到使用该端口的进程并将其杀死。但是,这些不提供我可以包含在脚本中的任何代码。除此之外,我还发现了this post,它说你无法让操作系统关闭套接字。然后它建议实现与上面相同的代码:

sockObj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

我意识到这不是一个完美的帖子,因为我无法在 MRE 中复制错误,但有人知道如何解决这个问题吗?

我在 MacOS 13.2.1 上使用 python 3.10.8。

python sockets
1个回答
0
投票

MacOS Sequoia 更新后出现此错误

操作系统错误:[Errno 48]地址已在使用中

更新我的电脑 MacOS Sequoia 后

要修复此问题,请在“设置”中关闭 Airplay 接收器

关闭

Airplay 接收器 -> 关闭

© www.soinside.com 2019 - 2024. All rights reserved.