@MaksMaksMaks
LOVE PROGRAMMING

Python: сокеты на dynamic dns, как реализовать?

Решил реализовать глобальный сокет сервер по динамическому dns с помощью сервиса no-ip.com настроил, проверил с помощью ping, пинг идет, но при попытке подключения через python возникает ошибка:
OSError: [WinError 10049] Требуемый адрес для своего контекста неверен
Код
import socket
sock = socket.socket()
sock.bind((socket.gethostbyname("***********.ddns.net"),0)) #host указан верно
sock.listen(1)
con,addr = sock.accept()
while True:
sock.send(b"HI")
sock.close()

P.S.connect тоже не работает
  • Вопрос задан
  • 861 просмотр
Решения вопроса 1
@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))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы