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
имеет IP-адрес eth0
, а не тот, к которому был подключен.
Это просто правило UDP? Это проблема / ограничение с классом Python UDPServer
? Это то, что я делаю неправильно? Можно ли как-нибудь разрешить эту работу, кроме простого подключения к eth0
IP (или прослушивания определенного IP, а не 0.0.0.0
)?