Pyzorは、通信プロトコルとしてUDP/IPを使用します。私たちは最近、パブリックサーバーを新しいマシンに切り替え、多くのタイムアウトのレポートを取得し始めました。私は、質問したIPをeth0:1
から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(または0.0.0.0
ではなく特定のIPでリッスンする)に接続するだけで、この作業を行うことができる方法はありますか?
これは、ここで起こっていることとまったく同じように思えます。私は上記のPythonと同じことをしたCクライアントを書いていましたが、私はまだ同じ結果を得ていますので、 "他のIPからの応答を拒否"しなければなりません(実際には、 )。 特定のアドレスにもバインドする必要があるようです。助けてくれてありがとう! –