【发布时间】:2010-11-21 12:23:15
【问题描述】:
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 是 eth0。188.40.77.236 是同一个服务器,但是是 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)之外,我还有什么方法可以完成这项工作?
【问题讨论】:
标签: python sockets udp ip multihomed