2010-03-17 15 views

risposta

10

L'indirizzo locale del collegamento IPv6 non è univoco sul nodo, è univoco per la NIC, motivo per cui è necessario specificare l'ID dell'ambito. In altre parole è perfettamente valido avere più adattatori con esattamente lo stesso indirizzo IPv6.

Ciò significa che è necessario immettere come input l'id-obiettivo o il modulo di testo appropriato (% eth0,% 1) che è possibile passare a getaddrinfo().

Un metodo consiste nel prendere un indirizzo IPv6 di collegamento locale, enumerare le interfacce e se solo una corrispondenza lo utilizza, se più di una corrispondenza si blocca con un elenco di interfacce e ottenere all'utente di specificare quale in modulo completo.

+0

L'indirizzo locale è formato da suo prefisso di routing e l'indirizzo MAC dell'interfaccia. Quindi se più adattatori sono disponibili sullo stesso host, ogni scheda di rete ha un indirizzo di collegamento locale diverso. – zeekvfu

+1

@Zind si assume erroneamente che ogni interfaccia abbia un indirizzo MAC univoco. Vedi l'hardware di Sun per un contro-esempio. –

3

Il problema si verifica solo quando si esegue l'hardcode di un indirizzo locale di collegamento, che non è realmente una soluzione pratica per un'app non banale.

In caso contrario, si dovrebbe essere sempre il tuo sockaddr di legare da getifaddrs(), che riempirà il campo di applicazione id per voi (ad es. Si può permettere che la tua all'utente di specificare un nome di interfaccia, quindi cercare attraverso la lista restituita da getifaddrs() di trovare l'indirizzo locale di collegamento associato a tale interfaccia).

3

per IPv6 link-indirizzi locali (fe80::/10 prefisso), il membro sin6_scope_id nella struttura è il numero di interfaccia e si può ottenere questo numero per

if_nametoindex(const char *ifname); 
Problemi correlati