首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中检查ip是否在网络中?

如何在Python中检查ip是否在网络中?
EN

Stack Overflow用户
提问于 2009-05-04 08:59:20
回答 21查看 167.6K关注 0票数 121

给定一个ip地址(比如192.168.0.1),如何在Python中检查它是否在网络中(比如192.168.0.0/24)?

Python中是否有用于ip地址操作的通用工具?像主机查找,ip地址到int,网络地址和网络掩码到int等等?希望是在2.5的标准Python库中。

EN

回答 21

Stack Overflow用户

回答已采纳

发布于 2009-05-04 09:21:30

This article表明,您可以使用socketstruct模块完成此任务,而无需付出太多额外的努力。我在文章中添加了一些内容,如下所示:

代码语言:javascript
复制
import socket,struct

def makeMask(n):
    "return a mask of n bits as a long integer"
    return (2L<<n-1) - 1

def dottedQuadToNum(ip):
    "convert decimal dotted quad string to long integer"
    return struct.unpack('L',socket.inet_aton(ip))[0]

def networkMask(ip,bits):
    "Convert a network address to a long integer" 
    return dottedQuadToNum(ip) & makeMask(bits)

def addressInNetwork(ip,net):
   "Is an address in a network"
   return ip & net == net

address = dottedQuadToNum("192.168.1.1")
networka = networkMask("10.0.0.0",24)
networkb = networkMask("192.168.0.0",24)
print (address,networka,networkb)
print addressInNetwork(address,networka)
print addressInNetwork(address,networkb)

这将输出以下内容:

代码语言:javascript
复制
False
True

如果你只想要一个接受字符串的函数,它应该是这样的:

代码语言:javascript
复制
import socket,struct

def addressInNetwork(ip,net):
   "Is an address in a network"
   ipaddr = struct.unpack('L',socket.inet_aton(ip))[0]
   netaddr,bits = net.split('/')
   netmask = struct.unpack('L',socket.inet_aton(netaddr))[0] & ((2L<<int(bits)-1) - 1)
   return ipaddr & netmask == netmask
票数 28
EN

Stack Overflow用户

发布于 2009-05-04 13:35:14

我喜欢使用netaddr实现这一点:

代码语言:javascript
复制
from netaddr import CIDR, IP

if IP("192.168.0.1") in CIDR("192.168.0.0/24"):
    print "Yay!"

正如arno_v在评论中指出的那样,新版本的netaddr是这样做的:

代码语言:javascript
复制
from netaddr import IPNetwork, IPAddress
if IPAddress("192.168.0.1") in IPNetwork("192.168.0.0/24"):
    print "Yay!"
票数 168
EN

Stack Overflow用户

发布于 2018-07-23 14:04:07

对于python3

代码语言:javascript
复制
import ipaddress
ipaddress.IPv4Address('192.168.1.1') in ipaddress.IPv4Network('192.168.0.0/24')
ipaddress.IPv4Address('192.168.1.1') in ipaddress.IPv4Network('192.168.0.0/16')

输出:

代码语言:javascript
复制
False
True
票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/819355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档