【发布时间】:2017-04-19 08:28:38
【问题描述】:
好的,我将尝试解释这里发生了什么...我有一个由多个相同类型设备组成的网络。我有一个程序可以在网络上的任何 pc 上运行,它可以发现这些单独的设备并按 ip、名称、mac 等对它们进行分类。该程序允许配置每个设备。设备将 udp 数据包广播到“255.255.255.255”,其中包含用于发现的信息。我可以运行wireshark 并拦截从设备广播的数据包。我有一个 python 程序,它将用我选择的数据广播 udp 数据包.. 现在.. 这源于我学习 python 和我的面向项目的方法.. 我这样学得更好:)。好吧,话虽如此..我的想法是广播另一个设备广播的确切udp数据包,这反过来应该让我作为特定网络设备进入发现软件。通过在wireshark中跟踪udp流,我可以复制数据并输入它在我的python程序中并在网络上广播。我可以广播到任何目标 IP 并在 Wireshark 中看到它,但是当我尝试将它发送到 255.255.255.255 时它永远不会出现。现在我明白路由器不会通过本地网络转发 255x4 广播。当我运行发现程序时,我可以看到所有设备将其数据包广播到 255x4,但看不到来自我的电脑的数据包。任何想法将不胜感激。
Python 代码:
import udp
import socket #for sockets
import sys #for exit
# create dgram udp socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error:
print 'Failed to create socket'
sys.exit()
host = '255.255.255.255';
port = 55558;
while(1) :
msg = '''...z..
hrQT.b.......hrQT.b
.....w...NanoStation M2...N2N
..Test......"XM.ar7240.v5.6.2.27929.150716.1201........NanoStation M2'''
try :
#Set the whole string
s.sendto(msg, (host, port))
# receive data from client (data, addr)
d = s.recvfrom(1024)
reply = d[0]
addr = d[1]
print 'Server reply : ' + reply
except socket.error, msg:
print 'Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
【问题讨论】:
-
您可能希望使用多播以便只中断感兴趣的设备,而不是网络上的所有设备。使用广播是一个坏主意。太糟糕了,广播完全从 IPv6 中删除,转而支持多播。许多公司会拒绝使用广播的应用程序,因为它会无缘无故地中断 LAN 上的每个主机,并且会带来一些安全风险。
标签: python sockets networking udp