Модуль net
Функции для работы с сетью
Модуль net предоставляет ICMP-проверку доступности узла. Разрешение доменных имён также доступно через socket.gethostbyname.
ping
net.ping(addr, size=32, timeout=0.2)
Отправляет один ICMP Echo Request через локальный Ethernet-интерфейс и ожидает соответствующий Echo Reply. Возвращает кортеж (elapsed_ms, result):
elapsed_ms— время ожидания/обмена в целых миллисекундах;result— код lwIP:0при успехе, отрицательное число при сетевой ошибке.
Аргументы можно передать позиционно или по имени:
addr— обязательная строка с числовым IPv4-адресом либо доменным именем;size— размер данных ICMP, целое от 1 до 128 байт, по умолчанию 32. Дополнительно передаются 8 байт заголовка ICMP и заголовок IP;timeout— ожидание в секундах, по умолчанию 0.2. После перевода в миллисекунды допустимо 1…4294967295; дробная часть миллисекунды отбрасывается. Ноль, отрицательные значения, NaN и бесконечность вызываютValueError.
Неверный размер вызывает ValueError. Ошибки обмена обычно возвращаются в result, поэтому их нужно проверять явно. Основные коды: -1 — не удалось выделить память, -3 — таймаут, -4 — ошибка маршрута, -8 — ресурс ping занят. Это коды lwIP, они не совпадают с положительными номерами errno сокетов.
import net
from time import sleep
# Замените адрес на доступный узел вашей сети, отвечающий на ICMP.
for _ in range(3):
elapsed_ms, result = net.ping('192.168.50.1', size=32, timeout=0.5)
if result == 0:
print('Ответ за', elapsed_ms, 'мс')
else:
print('Ошибка ping:', result)
sleep(1)
Отсутствие ответа не означает, что узел выключен: ICMP может фильтроваться. Доступность HTTP/TCP также не гарантирует ответ на ping.
Для доменного имени сначала выполняется DNS-разрешение. Его время не включается в elapsed_ms, а timeout ограничивает ожидание ICMP, не DNS. Нужны корректные сетевые настройки и DNS-сервер. При необходимости разрешайте адрес отдельно:
import socket
import net
# Требуется работающий DNS.
address = socket.gethostbyname('telematic.dev')
print(net.ping(address, size=32, timeout=0.5))
В модуле net нет gethostbyname: импортируйте эту функцию из socket. На контроллере X0 проверен обмен со шлюзом для размеров данных 1, 7, 32 и 128 байт, а также отклонение недопустимых аргументов. Это не проверка доступности любого внешнего домена.