【发布时间】:2015-09-29 09:01:39
【问题描述】:
我有一个简单的 Python 脚本,它试图在我的机器上侦听任何发送到有线以太网适配器(设置为 10.10.5.51 的静态 IP)的 UDP 数据:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.bind(('10.10.5.51', 72))
while True:
print(s.recvfrom(65535))
我可以从 wireshark 看到我的机器正在那个端口上接收数据,那么为什么 Python 脚本没有报告任何内容?
Edit1 - 测试本地地址
我尝试绑定到“127.0.0.1”并使用以下发件人/收件人发送到相同的地址,它可以正常工作...
发件人:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
source_port = 73
dest_port = 72
address = '127.0.0.1'
s.bind((address, source_port))
print("Sending from port: %d"%source_port)
while True:
print(s.sendto(bytes('Testing..','UTF-8'), (address, dest_port)))
接收者:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
port = 72
s.bind(('127.0.0.1', port))
print("Listening on port: %d"%port)
while True:
print(s.recvfrom(65535))
如果我将地址更改为我的以太网卡 (10.10.5.51) 的地址,那么我什么也看不到(wireshark 甚至没有显示任何流量)。
Edit2 - 更高的源端口
如果我将源端口连接到非特权端口(例如 11000),我现在可以看到我的 Python 发送方正在产生的流量...
发件人:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
source_port = 11000
dest_port = 72
address = '10.10.20.51'
s.bind((address, source_port))
print("Bound to address: "+address)
print("Sending from port %d to port %d"%(source_port,dest_port))
while True:
s.sendto(bytes('Testing..','UTF-8'), (address, dest_port))
接收者:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
port = 72
address = '10.10.20.51'
s.bind((address, port))
print("Listening on %s:%d"%(address,port))
while True:
print(s.recvfrom(65535))
...但我仍然没有看到wireshark 报告的流量。我的 Python 接收器是否可能以某种方式绑定到错误的适配器或类似的东西?
【问题讨论】:
-
我没有看到问题,但将 s.bind(('10.10.5.51', 72)) 更改为 s.bind(('0.0.0.0', 72)) 以确保
-
使用 '0.0.0.0' 不起作用。
-
您是否以特权用户身份运行代码?普通用户通常无法打开72等低端口号。
-
他没有提到任何错误,而且他使用的是windows 7,所以使用低端口不会有任何问题。
-
是否有防火墙阻止了您的应用程序?