Я хочу удаленно проверить, работает ли определенное устройство и подключено ли оно к сети. Для этого я нашел инструмент linux netcat, и это здорово. После некоторых поисков я наткнулся на этот пост , который, казалось, был близок к тому, что мне было нужно.
Мне также нужно было проверить соединение UDP, поэтому я адаптировался, как показано ниже:
def connection_test(sock):
"""
udptest from
https://github.com/openbsd/src/blob/master/usr.bin/nc/netcat.c
"""
for i in range(3):
if sock.send(b'X') == 1:
ret = 1
else:
ret = 0;
return ret
def netcat(hostname, port, protocol="tcp"):
if protocol == "udp":
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
else:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.settimeout(5)
s.connect((hostname, port))
# test connection
if protocol == 'udp':
if connection_test(s) == 0:
print("UDP FAIL")
return
s.shutdown(socket.SHUT_WR)
while 1:
data = s.recv(1024)
if data == b"":
break
print("Received:", data)
print("Connection closed.")
s.close()
except socket.timeout:
print("Connection Failed!")
except ConnectionRefusedError:
print("No connection could be made because \
the target machine actively refused it")
except ConnectionResetError:
print("An existing connection was forcibly\
closed by the remote host")
Кажется, что он работает нормально с TCP, но не работает для UDP на s.connect
, что имеет смысл, поскольку UDP является протоколом без установления соединения. Netcat также работает для UDP (netcat -z -v -u {host} {port}
), но я обнаружил, что он на самом деле не работает. Я думаю, что он просто отправляет несколько байтов по проводам, и все, потому что я отключил устройство, и netcat все еще возвращал:
Соединение с портом {host} {port} [udp / ssh] успешно!
Есть ли способ проверить, подключено ли устройство, поддерживающее только UDP, к сети, используя Python?