2017-02-11 2 views
0

Je dois envoyer un datagramme UDPv6 pouvant suivre ce message par un récepteur local (ou via tcpdump).Envoi UDPv6 localement dans golang

daddr, err = net.ResolveUDPAddr("udp6", "[address]:port") 
if err != nil { 
    return err 
} 

conn, err := net.DialUDP("udp6", nil, daddr) 
if err != nil { 
    return err 
} 
defer conn.Close() 

conn.Write(...) 

Contrairement à IPv4, ce code ne fonctionne pas avec IPv6. Par exemple, lorsque j'essaie d'envoyer un datagramme à une adresse de multidiffusion, par ex. à [FF01 :: DB8: 0: 0]: 5000, j'obtiens connect: invalid argument. La même chose arrive quand j'essaie de l'envoyer à [fe80 :: 20c: 29ff: fee1: d66]: 5000 (mon adresse IPv6 selon ifconfig).

Répondre

2

Dans les deux cas (multidiffusion locale de lien et multidiffusion locale d'interface), vous avez oublié de spécifier l'ID d'étendue. Sans cela, il est impossible de déterminer quelle interface utiliser, et vous obtenez une erreur Invalid argument du système d'exploitation.

net.UDPAddr utilise le champ Zone pour stocker l'ID d'étendue. Vous devez vous assurer que vous en avez fourni un, soit en définissant Zone explicitement, soit en utilisant le percent-suffix notation.

+0

Merci! Pour mon adresse de carte, j'obtiens 'write: connection refused', pour une adresse de multidiffusion (link-local) cela fonctionne comme prévu. – ababo