Мы получаем эту странную проблему на Raspberry Pi.
Мы запускаем сервис на сокете, который должен работать как для локальных, так и для удаленных клиентов через Wi-Fi.Проблема в том, что остановка удаленной сети также останавливает соединения от локальных клиентов.
Наш python-сервер настраивает сокет следующим образом:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_DONTROUTE, 1)
s.settimeout(2)
s.bind(("", 8888))
while True:
try:
conn, addr = s.accept()
except socket.timeout:
print("Socket timeout on s.accept(), continuing")
continue
#do stuff
У нас есть клиент локального узла, выполняющий такой цикл каждую секунду или около того (и фактически отправляющий данные):
// every second
socket.connect("localhost", "8888" );
socket.on('connect', function() { /* do stuff */ });
socket.on('error', function(ex) { });
Все работает нормально, пока не порежем вайфай.У нас тайм-аут на s.accept на стороне сервера, и мы видим сообщение об ошибке в наших журналах.
Я думаю, что сокет должен прослушивать 0.0.0.0, но почему-то не переключается на 127.0.0.1 или возникает какая-то странная ситуация с маршрутизацией.
netstat -an | grep 8888
дает
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8888 127.0.0.1:52794 TIME_WAIT
tcp 0 0 127.0.0.1:8888 127.0.0.1:52724 TIME_WAIT
tcp 0 0 127.0.0.1:8888 127.0.0.1:52740 TIME_WAIT
tcp 0 0 127.0.0.1:8888 127.0.0.1:52778 TIME_WAIT
netstart -rn
дает
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 304 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 304 0 0 wlan0
Я предполагаю, что нам просто нужен маршрут localhost?
Локальные соединения устанавливаются снова, когда Wi-Fi возвращается.Так что я не вижу постоянного сброса привязки в сокете Python.
строка hosts в /etc/nsswitch.conf
дает
hosts: files mdns4_minimal [NOTFOUND=return] dns
Мы проверяли ping на localhost во время теста, и он продолжает нормально работать.Мы также проверили netstat, чтобы убедиться, что порт остается LISTENING на 0.0.0.0. Возможно, это проблема?