点分十进制IP地址转int
import sys
if sys.version_info > (3, 0):
from functools import reduce
# 点分十进制IP地址转int
def ip_into_int(ip):
return reduce(lambda x,y:(x<<8)+y,map(int,ip.split('.')))
获取本机IP(点分十进制)
import sys
import socket
# 操作系统类型
SYSTEM_PLATFORM = platform.system()
def get_my_ip():
if SYSTEM_PLATFORM == 'Windows':
#获取计算机名称
hostname = socket.gethostname()
return socket.gethostbyname(hostname)
elif SYSTEM_PLATFORM == 'Linux':
for net_name in netifaces.interfaces():
if 'ens' not in net_name:
continue
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', bytes(net_name[:15],'utf-8')))[20:24])
# 另一种可行方法
# netifaces.ifaddresses(net_name)[netifaces.AF_INET][0]['addr']
判断点分十进制IP合法性
import re
def legit_ip(_ip):
compile_ip = re.compile('^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$')
if compile_ip.match(_ip):
return True
else:
return False
判断本机与指定IP是否处于同一局域网
# 子网掩码
SUB_MASK = '255.255.255.0'
def is_same_LAN(ip):
my_ip = get_my_ip()
# 如果本机没有联网或指定的IP不合法
if my_ip == '127.0.0.1' or not legit_ip(ip):
return False
my_ip = ip_into_int(my_ip)
ip = ip_into_int(ip)
mask = ip_into_int(SUB_MASK)
if my_ip & mask == ip & mask:
return True
else:
return False
判断是否为内网IP
def is_internal_ip(ip):
ip = ip_into_int(ip)
net_a = ip_into_int('10.255.255.255') >> 24
net_b = ip_into_int('172.31.255.255') >> 20
net_c = ip_into_int('192.168.255.255') >> 16
return ip >> 24 == net_a or ip >>20 == net_b or ip >> 16 == net_c
测试指定IP端口是否可连通
def IsOpen(ip, port, timeout): # timeout是超时时间
if isinstance(ip, int):
ip = int_to_ip(ip)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
try:
s.connect((ip, int(port)))
s.shutdown(0.1)
return True
except:
return False
扫描局域网内开放指定端口的计算机,返回IP地址列表
# 局域网扫描单个IP等待时间(s)
ScanPeerTimeout = 0.1
def scan_peer(port):
my_ip = get_my_ip()
if my_ip == '127.0.0.1':
return []
my_ip = ip_to_int(my_ip)
mask = ip_to_int(SUB_MASK)
subnet = my_ip & mask
subnet_range = mask ^ ip_to_int('255.255.255.255')
return [int_to_ip(i) for i in range(subnet + 1, subnet + subnet_range) if IsOpen(i, port, ScanPeerTimeout)]