#python #sockets #python-sockets
Вопрос:
я пытался создать сканер портов с помощью python и хочу проверить, открыт ли порт ipv6, я использовал следующий код
port = 80 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.bind(("0.0.0.0", port)) except socket.error as e: if e.errno == errno.EADDRINUSE: print("Port in use")
в этом случае я хочу привязать только порты ipv4, но socket.AF_INET
возникают ошибки, хотя порт 80 открыт только в ipv6
как я могу сделать так, чтобы он проверял только порты ipv4?
Комментарии:
1. Как вы думаете, почему порт 80 открыт только в ipv6? Насколько я понимаю, многие платформы Linux поддерживают двойной стек (как ipv4, так и ipv6), когда порт ipv6 привязан, если только эта функция явно не отключена.
2. Тривиальный тест для подтверждения: выполните то же самое для 8080 (или любого другого свободного порта), а затем посмотрите на netstat, чтобы узнать, какие порты на самом деле прослушивают.
3. @FrankYellin я слушал tcp6 порт 80 с помощью socat
4. Многие платформы допускают отдельные привязки для IPv4 и IPv6 на одном и том же порту. Если порт уже привязан к IPv6, привязка того же порта для IPv4 может быть успешной. Если вы хотите проверить, используется ли порт уже для IPv6, используйте сокет IPv6 для привязки.
AF_INET
предназначен для IPv4,AF_INET6
предназначен для IPv6