s.bind ((хост, порт)) - имя или имя сервера не указано или неизвестно в Python 3.6 - PullRequest
0 голосов
/ 25 июня 2018

В проекте, который включал хост (меня) ... это было написано:

screenshot

и я получил это:

screenshot

socket.gaierror: [Errno 8] указано ни имя, ни имя сервера, либо неизвестно

Вот что должно произойти: https://www.youtube.com/watch?v=Cuyu3VU0yD4&frags=pl%2Cwn

У кого-нибудь из вас есть решение ???

1 Ответ

0 голосов
/ 25 июня 2018

Вы должны поместить фрагмент кода и сообщение об ошибке непосредственно в ваш вопрос.

В любом случае: не рекомендуется использовать имена хостов для привязки сокета.На самом деле вы привязываете сокеты к доступным сетевым интерфейсам (которые представлены IP-адресами).Если вы поместите некоторую строку в раздел host в s.bind((host, port)), который на самом деле не является действительным адресом IPv4 или IPv6, строка будет заменена первым IP-адресом, который DNS-сервер возвращает для этой строки.Если вы хотите, чтобы ваша программа работала предсказуемо на всех компьютерах, используйте IP-адреса или просто подключитесь ко всем интерфейсам.

Возможные решения:

  1. Пока вам нужно только соединение для работылокально на вашем компьютере, используйте host = 'localhost' или host = '127.0.0.1'
  2. Если вы хотите, чтобы он работал в вашей локальной сети, вы можете просто привязать сокет к всем доступным сетевым интерфейсам, используя host = '' или host = '0.0.0.0'.Если компьютер, на котором вы запускаете программу, является обычным ПК, то, скорее всего, у него есть только один сетевой адаптер, кроме localhost.Пока вы не перенаправите порт, к которому привязываете сокет, на ваш внешний IP-адрес, предоставленный вам нашим Интернет-провайдером, устройства вне вашей локальной сети не смогут подключиться к этому сокету.
  3. Если вы хотите правильно перебирать доступные сетевые интерфейсы и соответствующие им IP-адреса, используйте библиотеку, например netifaces или ifaddr .

Вот примерс ifaddr (установить с pip install ifaddr):

import ifaddr

def get_available_ip_addresses():
    addresses = []
    for adapter in ifaddr.get_adapters():
        for ip in adapter.ips:
            if ip.is_IPv4:
                addresses.append(ip.ip)
    return addresses

Этот метод возвращает список всех адресов IPv4 сетевых адаптеров, доступных на компьютере, на котором работает программа (в виде строк, которыеможет напрямую использоваться с библиотекой сокетов).

s = socket.socket()
lan_addresses = [addr for addr in get_available_ip_addresses() if addr[:3] in ['10.', '172', '192']]
host = lan_addresses[0]
port = 8080
s.bind((host, port))

Это свяжет сокет с первым IPv4-адресом, возвращаемым функцией, которую я определил, которая находится в обычном адресном пространстве LAN.На большинстве обычных домашних ПК, подключенных к маршрутизатору, который обеспечивает подключение к Интернету через локальную сеть, get_available_ip_addresses(), как определено здесь, возвращает два адреса: ['127.0.0.1', '192.x.x.x'], где вторым является некоторый адрес, который сетевой адаптер вашего компьютера дал вашему маршрутизатору.

Надеюсь, я смогу помочь.

Приветствия, Сайлас

...