Хотя это старый вопрос, я подумал о добавлении ответа , который работает и помогает любому, кто наткнется на него позже.
Ключевые проблемы:
Необработанные сокеты не связаны и соединены с другими сокетами. Также sendto является правильным API для использования.
Кроме того, для пакетов ipv6 требуется 4 структуры кортежей для адреса назначения, а для ipv4 - две структуры кортежей.
Наконец, стек (по крайней мере в Linux mint 15) более строг в отношении пакетов ipv6. Если вы попытаетесь отправить пустой эхо-запрос icmpv4, python разрешит его и отправит пакет с меньшим значением по проводам. Где, как и в случае с ipv6, он просто выдает ошибку «неверный аргумент», когда вы пытаетесь отправить пустой пакет. Следовательно, действительный запрос также требуется в случае ipv6. Следующий пример делает все это для ipv6 и отправляет действительный запрос эхо-запроса на обратный адрес.
import socket
def main(dest_name):
addrs = socket.getaddrinfo(dest_name, 0, socket.AF_INET6, 0, socket.SOL_IP)
print addrs
dest = addrs[0]
# A minimal ICMP6-echo message (thanks to abarnert)
data = '\x80\0\0\0\0\0\0\0'
icmp = socket.getprotobyname('ipv6-icmp')
#print icmp
send_socket = socket.socket(socket.AF_INET6, socket.SOCK_RAW, icmp)
print "sent to " + str(dest[4])
send_socket.sendto(data, dest[4])
send_socket.close()
if __name__ == '__main__':
main('::1')