如何查看某个地址范围内有多少个客户端?

2 投票
4 回答
3853 浏览
提问于 2025-04-16 07:06

我试着在网上搜索这个问题,但没找到相关的信息……我正在制作一个端口扫描器,我想让它能够扫描一个网络范围,比如192.168.2.*,然后找出这个范围内有多少台电脑是在线的。这个功能和Nmap很像。我是在用Python编程。请问在Python中可以做到吗?

4 个回答

0

使用原始套接字,你可以实现类似nmap的功能。你可能会发现,最有用的探测需要使用一些特别制作的数据包,这些数据包做的事情和正常的编程接口相比有点“奇怪”。了解一下IP/UDP/TCP的RFC文档是非常有帮助的。

通过原始套接字,你可以逐字节地生成任何你想要的探测数据包,并设置一些通常在正常情况下很难或不可能做到的选项和配置,这样可以“欺骗”主机,让它透露出大量的信息。

2

使用 python-nmap。基本用法如下:

import nmap
nm = nmap.PortScanner()
nm.scan(hosts='192.168.2.0/24', arguments='-n -sP -PE -PA21,23,80,3389')
hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
for host, status in hosts_list:
    print('{0}:{1}'.format(host, status))

想要了解更多,可以查看这个链接:http://pypi.python.org/pypi/python-nmap

1

这里有一个草稿示例,你可以用它来开始:

import socket

addr_range = "192.168.1.%d"

ip_address_up = []

# Use UDP. 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.settimeout(2.0)

for i in range(1, 254):
    try:
        ip = addr_range % i
        socket.gethostbyaddr(ip)
        ip_address_up.append(ip)
    except socket.herror as ex:
        pass

print ip_address_up

或者你也可以用ICMP(ping)来做类似的事情,而不是使用UDP:

import socket
import ping

ip_address_up = []

addr_range = "192.168.1.%d"

for i in range(1, 254):       
   try:
       ip = addr_range % i
       delay = ping.do_one(ip, timeout=2)
       ip_address_up.append(ip)
   except (socket.herror, socket.timeout) as ex:
       pass

print ip_address_up

撰写回答