我试图在
Python中创建一个仅监听UDP数据包的原始套接字:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
s.bind(('0.0.0.0', 1337))
while True:
print s.recvfrom(65535)
这需要以root用户身份运行,并在端口1337上创建一个原始套接字,它接收UDP数据包并在收到它们时打印它们;没有问题.
现在让我们做一个小客户端来测试它是否有效:
import socket
c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
c.connect(('127.0.0.1', 1337))
c.send('message 1')
c.send('message 2')
c.send('message 3')
c.send('message 4')
c.send('message 5')
c.send('message 6')
始终如一,只有第一条,第三条和第五条消息(消息1,消息3和消息5)将通过并打印在服务器输出中.第二,第四和第六条消息未显示在服务器输出上,而是客户端获得异常:
>>> c.send('message 2')
Traceback (most recent call last):
File "", line 1, in
socket.error: [Errno 111] Connection refused
在Wireshark中运行它表明它正在获取“目标无法访问”的ICMP回复.我已经能够在3台不同的机器上重现这一点(所有机器都在运行Linux).我错过了什么吗? UDP的这种预期行为是否始终丢弃数据包,因为使用它的协议应该容忍数据包丢失?即便如此,为什么在本地接口上发送数据包会被丢弃?
将服务器绑定到127.0.0.1而不是0.0.0.0具有相同的结果.