使用Python查找局域网中的在线节点
我正在用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()