如何在Python中查找网络中的IP地址

-1 投票
1 回答
513 浏览
提问于 2025-04-16 19:14

我想知道怎么用Python编程来查找网络中一段范围内的TCP IP地址,比如从132.32.0.3到132.32.0.44。同时,我还想知道哪些IP是活的,哪些是死的。请帮帮我,谢谢回复我的人!

1 个回答

1

第一部分 - "查找IP地址"

你给的例子范围,132.32.0.3132.32.0.44 并不符合任何子网,这点很奇怪。

通常,用来检查主机是否在线的应用程序一般是在一个子网内进行的,比如 192.168.0.0/28(主机地址范围是 192.168.0.1192.168.0.14)。

如果你想计算一个子网内的地址,我建议你使用 ipaddr。比如:

>>> from ipaddr import IPv4Address, IPNetwork
>>> for a in IPNetwork('192.168.0.0/28').iterhosts():
...   print a
...
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6
192.168.0.7
192.168.0.8
192.168.0.9
192.168.0.10
192.168.0.11
192.168.0.12
192.168.0.13
192.168.0.14

不过,如果你确定想要一个任意的范围,你可以把IPv4地址转换成一个整数,增加这个整数,然后再转换回点分式的IP地址。比如:

def aton(a):
  """
  Change dotted ip address to integer
  e.g. '192.168.0.1' -> 3232235521L
  """
  return reduce(lambda x,y: (x<<8) + y, [ int(x) for x in a.split('.') ])

def ntoa(n):
  """
  Change an integer to a dotted ip address.
  e.g. 3232235522L -> '192.168.0.2'
  """
  return "%d.%d.%d.%d" % (n >> 24,(n & 0xffffff) >> 16,(n & 0xffff) >> 8,(n & 0xff))

def arbitraryRange(a1,a2):
  """
  Generate all IP addresses between two addresses inclusively
  """
  n1, n2 = aton(a1), aton(a2)
  assert n1 < n2
  i = n1
  while i <= n2:
    yield ntoa(i)
    i += 1

提供:

>>> for a in arbitraryRange('192.168.0.10','192.168.0.20'):
...   print a
...
192.168.0.10
192.168.0.11
192.168.0.12
192.168.0.13
192.168.0.14
192.168.0.15
192.168.0.16
192.168.0.17
192.168.0.18
192.168.0.19
192.168.0.20

第二部分 - "在线还是离线"

关于“在线”或“离线”的问题其实很复杂,完全取决于你对这些词的定义。为了提供一些背景和对比,这里有一份关于IP地址/主机的可测试特性列表:

  • 是否对ARP请求有响应?
  • 是否对ICMP回显请求有响应?
  • 是否对TCP SYN有响应?

撰写回答