Pyzor使用 UDP/IP 作为通信协议。我们最近将公共服务器切换到一台新机器,并开始收到许多超时的报告。我发现如果我将查询的 IP 从 更改为 ,我可以解决eth0:1
问题eth0
。
我可以用一个简单的例子重现这个问题:
这是服务器代码:
#! /usr/bin/env python
import SocketServer
class RequestHandler(SocketServer.DatagramRequestHandler):
def handle(self):
print self.packet
self.wfile.write("Pong")
s = SocketServer.UDPServer(("0.0.0.0", 24440), RequestHandler)
s.serve_forever()
这是客户端代码(188.40.77.206
is eth0
. 188.40.77.236
是同一个服务器,但是 is eth0:1
):
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.sendto('ping', 0, ("188.40.77.206", 24440))
4
>>> s.recvfrom(1024)
('Pong', ('188.40.77.206', 24440))
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.sendto('ping', 0, ("188.40.77.236", 24440))
4
>>> s.recvfrom(1024)
[never gets anything]
服务器在这两种情况下都会收到“ping”数据包(因此在这两种情况下都会发送“pong”数据包)。
奇怪的是,这在某些地方确实有效(即我会得到两个 IP 的响应)。例如,它适用于188.40.37.137
(相同的网络/数据中心,不同的服务器),也适用于89.18.189.160
(不同的数据中心)。在这些情况下,recvfrom
响应确实具有eth0
IP,而不是连接到的 IP。
这只是UDP的规则吗?这是Python UDPServer
类的问题/限制吗?是我做错了什么吗?除了简单地连接到eth0
IP(或侦听特定 IP 而不是0.0.0.0
)之外,还有什么方法可以让我完成这项工作?