使用Python查找局域网中的在线节点

5 投票
5 回答
20687 浏览
提问于 2025-04-17 19:25

我正在用Python 2.7和Windows创建一个类似于IP Messenger的聊天工具。

我想要的功能是能够在局域网中找到运行相同软件的系统,但是我对这个技术的实现方式不是很明白。

有没有人能帮我解决在局域网中找到运行相同软件的计算机的IP地址或主机名的问题,使用的是Python 2.7和Socket库。

请推荐一些可以在Windows上实现的方法,不要像Nmap那样(只限于Linux),如果能提供Python的Socket库代码就太好了。

5 个回答

0

根据aki92的回答...

import re
import subprocess
# ...

nodes = re.findall(r'\\(.+?)(?: .*)?\n',subprocess.check_output('net view'))
2

你想做的是在本地网络中寻找活跃的设备。可以参考这个脚本,它使用了Scapy,可能就能满足你的需求。另外,这个纯Python的实现也是一个更轻量的选择。

如果你想获取当前的IP地址,可以参考这个问题中的解决方案。

你可以扩展前面提到的Ping类,这样就能把结果提取出来,方便阅读:

# TODO: This is a quick hack to retrieve the results 
# of the ping, you should probably do something a bit more elegant here!
class PingQuery(Ping):
    def __init__():
        super().__init__()
        result = false

    def print_success(self, delay, ip, packet_size, ip_header, icmp_header):
        result = ip

然后你可以遍历子网中的地址,找到活跃的机器列表:

subnet = "192.168.0." # TODO: Trim the last number off the IP address retrieved earlier
for i in range(1, 255):
    hostname = subnet + i
    p = PingQuery(hostname, 500, 55) # Timeout after 500ms per node
    p.run(1)
    if (p.result):
        print p.result + " is live"

接下来,你可以通过尝试连接每台机器的特定端口来检查这些活跃的机器,看看是否能收到一个特别定制的TCP数据包,这样就能证明正在监听的程序确实是你的软件。

10

Windows命令提示符中的net view命令解决了我在问题中提到的困扰。

通过这个命令,我可以找到所有通过局域网连接到我电脑的其他电脑,然后我会向这些电脑发送数据包,回复我数据包的电脑就是和我运行相同软件的系统,这样就完全解决了我的问题。

这段代码列出了所有通过局域网与我的电脑连接的电脑的主机名。

import os
os.system('net view > conn.tmp')
f = open('conn.tmp', 'r')
f.readline();f.readline();f.readline()

conn = []
host = f.readline()
while host[0] == '\\':
    conn.append(host[2:host.find(' ')])
    host = f.readline()

print conn
f.close()    

撰写回答