Проблема состоит из двух частей
Первый выпуск
Вам следует использовать sa.bind (sockaddr), где sockaddr получен из getaddrinfo
>>> HOST = 'localhost'
>>> PORT = 50007
>>> res = socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_DGRAM, 0, socket.AI_PASSIVE)
>>> family, socktype, proto, canonname, sockaddr = res[1]
>>> proto
17
>>> sockaddr
('fe80::1%lo0', 50007, 0, 1)
Второй выпуск
Если вы посмотрите на пример, приведенный в документации к сокету, по адресу
Socket принимает три аргумента
socket( [family[, type[, proto]]])
Согласно документации
Create a new socket using the given address family,
socket type and protocol number. The address family
should be AF_INET (the default), AF_INET6 or AF_UNIX.
The socket type should be SOCK_STREAM (the default),
SOCK_DGRAM or perhaps one of the other "SOCK_" constants.
The protocol number is usually zero and may be omitted in that case.
И если вы использовали getaddressinfo для получения значений для proto, то значение отличается от значения по умолчанию 0
Но когда я выполнил следующее, я получил другое значение протокола - 17. Возможно, вы захотите исследовать это тоже.
И, конечно, socket.has_ipv6 для меня верно.