Pyzor使用UDP/IP作爲通信協議。我們最近將公共服務器切換到一臺新機器上,並開始獲取許多超時報告。我發現如果將查詢的eth0:1
IP更改爲eth0
,我可以解決問題。UDP服務是否必須從連接的IP地址進行響應?
我可以重現此問題,以簡單的例子:
這是服務器代碼:
#! /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」分組(並且因此發送「PON g「包)。
奇怪的是,這確實工作從一些地方(即我會得到來自兩個IP的響應)。例如,它可以從188.40.37.137
(相同的網絡/數據中心,不同的服務器)運行,但也可以從89.18.189.160
(不同的數據中心)運行。在這些情況下,recvfrom
響應確實具有IP地址eth0
,而不是已連接的IP地址。
這只是UDP的規則?這是否是PythonUDPServer
類的問題/限制?這是我做錯了什麼嗎?有沒有什麼辦法可以讓我從簡單地連接到eth0
IP(或聽取特定的IP而不是0.0.0.0
)這個工作?
這聽起來像這裏發生的事情。我寫了一個C客戶端,它和上面的Python做了同樣的事情,而且我仍然得到相同的結果,所以「拒絕來自其他IP的響應」必須在C庫級別發生(這實際上意味着我堅持了它)。 看起來我還需要綁定到特定的地址。謝謝您的幫助! – 2009-08-21 02:19:40