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。
MacOS Sequoia 更新后出现此错误
操作系统错误:[Errno 48]地址已在使用中
更新我的电脑 MacOS Sequoia 后
要修复此问题,请在“设置”中关闭 Airplay 接收器
关闭
Airplay 接收器 -> 关闭