Мне пришлось решить проблему «Определить, является ли IP-адрес локальным или нет», и моей первой мыслью было создать список IP-адресов, которые были локальными, а затем сопоставить их. Это то, что привело меня к этому вопросу. Однако позже я понял, что есть более простой способ сделать это: попробуйте привязать этот IP и посмотреть, работает ли он.
_local_ip_cache = []
_nonlocal_ip_cache = []
def ip_islocal(ip):
if ip in _local_ip_cache:
return True
if ip in _nonlocal_ip_cache:
return False
s = socket.socket()
try:
try:
s.bind((ip, 0))
except socket.error, e:
if e.args[0] == errno.EADDRNOTAVAIL:
_nonlocal_ip_cache.append(ip)
return False
else:
raise
finally:
s.close()
_local_ip_cache.append(ip)
return True
Я знаю, что это не дает прямого ответа на вопрос, но это должно быть полезно для всех, кто пытается решить связанный вопрос и кто следовал тому же ходу мыслей. Это имеет то преимущество, что является кроссплатформенным решением (я думаю).