如何在python中找到网络中的ips

时间:2011-06-09 10:15:38

标签: python sockets tcp

如何通过python编程在网络中找到具有范围(即132.32.0.3到132.32.0.44)的TCP ips,并且还想知道哪些ips存活且哪些已经死亡。请寄给我..感谢回复......

1 个答案:

答案 0 :(得分:1)

第1部分 - “查找IP”

您的示例范围132.32.0.3132.32.0.44与任何子网都不匹配,这很奇怪。

通常用于检查主机是否向上和向下的应用程序通常在子网内确定范围,例如, 192.168.0.0/28(主机地址:192.168.0.1192.168.0.14)。

如果您想计算子网内的地址,我建议您使用ipaddr。 E.g:

>>> 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。 E.g:

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

第2部分 - “活着或死亡”

“活着”或“死亡”的问题很复杂,完全取决于这些术语的含义。为了提供上下文和对比,这里有一个关于IP地址/主机的可测试质量列表:

  • 响应ARP请求?
  • 响应ICMP回应请求?
  • 响应TCP ​​SYN?