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
가 188.40.77.236
가 같은 서버입니다 eth0
이지만, 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]
서버는 두 경우 모두에서 "핑"패킷을 가져옵니다 (따라서 "폰 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의 응답 거부"가 C 라이브러리 레벨에서 발생해야합니다.). 특정 주소에도 바인딩해야합니다. 도와 주셔서 감사합니다! –