Ответы пользователя по тегу DynDNS
  • Python: сокеты на dynamic dns, как реализовать?

    @bbkmzzzz
    sock.bind((socket.gethostbyname("***********.ddns.net"),0)) #host указан верно

    На Вашем компьютере существует сетевой интерфейс (грубо говоря - сетевая карта) с адресом, который резолвится из ***********.ddns.net? Вы будете принимать входящие соединения? Ведь вы привязываете сокет на доступность с определенного интерфейса для входящих(!) подключений. Если не указывать интерфейс - сокет будет доступен на всех сетевых интерфейсах компьютера.

    Нулевой порт использовать можно только если Вы четко знаете что делаете. Все порты до 1024 требуют прав администратора для привязки сокета.

    Для корректной работы нужно два условия:
    1: Вы привязываете сокет на существующий интерфейс сетевой карты, или на все, если использовать "socket.bind(('', port))
    2: порт, который Вы пытаетесь привязать к сокету никто еще не использует.

    Для подключения куда-либо bind использовать не нужно, bind только для прослушивания.
    порт для подключения через connect - обязателен.

    import socket
    sock = socket.socket()
    HOST = socket.gethostbyname("***********.ddns.net")
    PORT = 80
    sock.connect((HOST, PORT)) #host указан верно PORT - обязательно
    # sock.listen(1) - только для прослушивания
    # con,addr = sock.accept() только для прослушивания
    #while True:  не имеет смысла, нет корректного выхода из цикла.
    sock.send(b"HI")
    cock.close()


    Учтите, что sock.accept() операция блокирующая, т.е. программа будет ждать входящего подключения пока оно не случится.

    Пример из документации:
    # Echo server program
    import socket
    
    HOST = ''                 # Symbolic name meaning all available interfaces
    PORT = 50007              # Arbitrary non-privileged port
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen(1)
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(1024)
                if not data: break
                conn.sendall(data)

    # Echo client program
    import socket
    
    HOST = 'localhost'    # адрес, куда подключаемся,  localhost = 127.0.0.1
    PORT = 50007              # The same port as used by the server
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(b'Hello, world')
        data = s.recv(1024)
    print('Received', repr(data))
    Ответ написан
    Комментировать