Ошибка при привязке локального сокета при падении Wi-Fi - PullRequest
2 голосов
/ 19 сентября 2019

Мы получаем эту странную проблему на 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. Возможно, это проблема?

1 Ответ

1 голос
/ 19 сентября 2019

Самое простое решение

Похоже, что вы должны избегать именования, используя "127.0.0.1", как описано в нашем обсуждении комментариев.

Более подробно:

Согласнок источнику и docs (после первого теста nodejs для ip ,) он проверяет, предоставили ли вы функцию поиска в качестве опции для подключения, если нет, он выполняетсобственный "dns.lookup" вызов по умолчанию.Несмотря на название, эта функция на самом деле пытается использовать системное именование, но может немного отличаться, например, она может попытаться отдать предпочтение ipv6.

Для дальнейшей отладки вы можете попытаться сделать более прямой тестовый пример с помощью dns.ищите и сравнивайте такие вещи, как вывод getent ahosts|ahostsv4|ahostsv6 localhost с вашими различными системами и когда Wi-Fi не работает, а также сравнивайте другие конфигурации, такие как gai.conf, чтобы попытаться определить, немного ли отличаются имена систем в этой системе или данынемного разные запросы.

...