Python Netcat тест UDP подключения - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу удаленно проверить, работает ли определенное устройство и подключено ли оно к сети. Для этого я нашел инструмент 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?

...