Проверьте наличие открытого порта ipv4 или ipv6

#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