2012-09-04 12 views
6

Ho questa semplice coppia di applicazioni client-server. Il codice è piuttosto semplice, sto usando solo metodi nuovi, consigliati come getaddinfo etc e tutto funziona perfettamente per ipv4. Anche per ipv6 loopback (:: 1) funziona. I problemi iniziano quando si tratta di altri indirizzi IPv6 ... Ho due macchine in una rete, tutto funziona bene quando passo i loro indirizzi IPv4, ma quando do l'indirizzo IPv6 del mio client, ottengo un errore sulla funzione connect: argomento non valido . Ehi, non lo so già? Lo voglio! Quando cerco di ping6 questo indirizzo IPv6, ottengo lo stesso errore:connect() restituisce "argomento non valido" con indirizzo ipv6

connect: Invalid argument

Ma c'è un modo per superare questo blocco - si dovrebbe scegliere un'interfaccia con un interruttore -I e tutto fila liscio dal poi. Ma come posso ottenere lo stesso risultato nella mia app client? Cosa dovrei fare? Il mio codice cliente si presenta così:

struct addrinfo hints; 
struct addrinfo *server; 

memset(&hints, 0, sizeof(hints)); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 

int status; 
if((status = getaddrinfo(argv[1], argv[2], &hints, &server) != 0)) 
{ 
    perror("getaddrinfo error"); 
    return 1; 
} 

int sock_fd; 
struct addrinfo *ptr; 
for(ptr=server;ptr!=NULL;ptr=ptr->ai_next) 
{ 
    if((sock_fd = socket(ptr->ai_family,ptr->ai_socktype,ptr->ai_protocol)) == -1) 
    { 
     perror("socket error"); 
     continue; 
    } 
    if(connect(sock_fd, ptr->ai_addr,ptr->ai_addrlen) == -1) 
    { 
     perror("connect error"); 
     continue;  
    } 
    break; 
} 
+1

Qual è l'indirizzo problematico che il ping respinge? – Ariel

+0

Sto pingando l'altra macchina nella mia rete ma funziona allo stesso modo per tutti gli indirizzi IPv6 - verifica questo: http://lists.debian.org/debian-ipv6/2005/06/msg00044.html – flyjohny

+0

@flyjohny forse tu dovresti controllare i tuoi percorsi per vedere se il percorso predefinito è un ip6 route command: "route -A inet6" –

risposta

5

Gli indirizzi che iniziano con ff... sono indirizzi multicast. La connessione di uno stream a un indirizzo multicast non funziona.

Gli indirizzi che iniziano con fe80... sono indirizzi locali di collegamento, a cui è associato un identificatore di interfaccia. Prova a guardare lo sockaddr restituito da getaddrinfo, il campo scope è stato compilato?

+0

Viene riempito con 0. L'indirizzo inizia effettivamente con fe80 ... – flyjohny

+2

Questo campo deve contenere il numero di interfaccia. Hai specificato l'ambito con '% eth0' o'% 1' (1 è il numero di interfaccia, che puoi cercare con la notazione 'ip')? \ –

+0

No. Quando lo faccio, questo campo di scope è pieno di un certo valore e sembra funzionare (anche se ho bisogno di configurare il mio FW specifico, ma non ottengo più argomenti non validi). Ma a me sembra mancare qualcosa e in tutti i materiali connessi con ipv6 che stavo leggendo non mi sono imbattuto in questo - devo specificare l'interfaccia ogni volta che uso l'indirizzo link-local? – flyjohny

0

mia raccomandazione è che si accende il protocollo IP6 nel collegamento di interfaccia/di rete, oltre buttare via il protocollo ip4 se avete ancora l'errore.

Nella mia Linux Box questo è successo anche quando ho avuto un'interfaccia ip4 attiva e la mia applicazione ha provato a usare l'interfaccia IP4 con le impostazioni ip6. Lo stesso dovrebbe essere valido anche per Windows.

Se qualcosa non è chiaro chiedere.

+0

So che sono pigro ma potresti dirmi come accendere il protocollo ip6 nell'interfaccia? Sto usando una scatola Linux. – flyjohny

+0

Prima controlla questa guida http://tldp.org/HOWTO/Linux+IPv6-HOWTO/x790.html dopo averlo provato sulla tua interfaccia specifica: ping6 -I eth0 "riempi l'ip6addr qui" potrebbe essere che la tua interfaccia di loopback abbia il supporto per ip6 attivato e quindi il ping locale funziona senza problemi, puoi dirci la tua distribuzione Linux e la versione del kernel? –

6

è necessario specificare l'interfaccia per IPv6 ping (cioè -I eth0):

ping6 -I eth0 fe80::208:54ff:fe34:22ae 

Utilizzando gli indirizzi link-local per un ping IPv6, richiede di definire quale dispositivo deve inviare/ricevere il pacchetto - ogni dispositivo ha un indirizzo locale di collegamento.

Cercando senza questo, si tradurrà in un messaggio di errore del tipo:

--> # ping6 fe80::208:54ff:fe34:22ae 
connect: Invalid argument 

In questo caso è necessario specificare l'interfaccia in aggiunta, come illustrato di seguito:

--> # ping6 -I eth0 fe80::208:54ff:fe34:22ae 
PING fe80::208:54ff:fe34:22ae(fe80::208:54ff:fe34:22ae) from fe80::208:54ff:fe34:22ae eth0: 56 data bytes 
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=0 ttl=64 time=0.027 ms 
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=1 ttl=64 time=0.030 ms 
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=2 ttl=64 time=0.036 ms 

Un approccio simile è necessario seguire nel tuo client APP ..

Problemi correlati