#python #sockets
#python #сокеты
Вопрос:
У меня есть небольшой односторонний отправитель сообщений, который работает, пока я указываю IP для подключения в коде, однако у меня возникают проблемы с разрешением сокету принимать соединения с любого IP. Вот строка, в которой проблема.
mySocket = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
mySocket.bind ( ( '', 2727 ) )
''
Предназначен для локального хоста, и он работает, если я вручную ввожу IP, например '192.168.1.106'
, однако, как я могу оставить его открытым для всех? Или я использую неправильный тип соединения для этого?
Ответ №1:
Если вы хотите привязаться ко всем доступным адресам IPv4, укажите 0.0.0.0
в качестве своего IP-адреса. Если вы находитесь за маршрутизатором и хотите, чтобы ваш сокет был доступен через Интернет, а не только в вашей локальной сети, вам необходимо настроить правило переадресации портов, чтобы пользователи за пределами вашей локальной сети могли получить доступ к сервису.
Смотрите следующий вопрос ServerFault для получения дополнительной информации о 0.0.0.0
: https://serverfault.com/questions/78048/whats-the-difference-between-ip-address-0-0-0-0-and-127-0-0-1
Комментарии:
1. Возможно ли привязать к полностью настраиваемым IP-адресам, таким как 152.64.87.9?
2. @CMCDragonkai Только в том случае, если ваша система имеет интерфейс с этим адресом.
3. Поэтому мне нужно было бы создать эти интерфейсы до привязки к ним. И создание виртуальных интерфейсов было бы обратным циклом, верно?
4. Это будет только IPv4? Как насчет привязки ко всем доступным адресам IPv6?
Ответ №2:
Привязка к ''
имеет тот же эффект, что и к '0.0.0.0'
, что облегчает переход на IPv6.
В зависимости от ОС, при открытии socket.AF_INET6
сокета прослушиваются IPv4 и IPv6.
Комментарии:
1. Отчет об ошибке Python, чтобы сделать документы более четкими по этому поводу: bugs.python.org/issue33921
2. Согласно документам ,
''
это не совместимо с IPv6: такое поведение несовместимо с IPv6, поэтому вы можете захотеть избежать этого, если собираетесь поддерживать IPv6 в своих программах на Python.
Ответ №3:
Привязка к 0.0.0.0 позволит ему принимать соединения с любого адреса IPv4, который может направлять к нему.