Вы должны поместить фрагмент кода и сообщение об ошибке непосредственно в ваш вопрос.
В любом случае: не рекомендуется использовать имена хостов для привязки сокета.На самом деле вы привязываете сокеты к доступным сетевым интерфейсам (которые представлены IP-адресами).Если вы поместите некоторую строку в раздел host
в s.bind((host, port))
, который на самом деле не является действительным адресом IPv4 или IPv6, строка будет заменена первым IP-адресом, который DNS-сервер возвращает для этой строки.Если вы хотите, чтобы ваша программа работала предсказуемо на всех компьютерах, используйте IP-адреса или просто подключитесь ко всем интерфейсам.
Возможные решения:
- Пока вам нужно только соединение для работылокально на вашем компьютере, используйте
host = 'localhost'
или host = '127.0.0.1'
- Если вы хотите, чтобы он работал в вашей локальной сети, вы можете просто привязать сокет к всем доступным сетевым интерфейсам, используя
host = ''
или host = '0.0.0.0'
.Если компьютер, на котором вы запускаете программу, является обычным ПК, то, скорее всего, у него есть только один сетевой адаптер, кроме localhost.Пока вы не перенаправите порт, к которому привязываете сокет, на ваш внешний IP-адрес, предоставленный вам нашим Интернет-провайдером, устройства вне вашей локальной сети не смогут подключиться к этому сокету. - Если вы хотите правильно перебирать доступные сетевые интерфейсы и соответствующие им 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']
, где вторым является некоторый адрес, который сетевой адаптер вашего компьютера дал вашему маршрутизатору.
Надеюсь, я смогу помочь.
Приветствия, Сайлас