2010-03-16 13 views
8
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdio.h> 

void error(char *msg) 
{ 
    perror(msg); 
    exit(0); 
} 
int main(int argc, char *argv[]) 
{ 
    int sock, length, fromlen, n; 
    struct sockaddr_in6 server; 
    struct sockaddr_in6 from; 

    int portNr = 5555; 
    char buf[1024]; 

    length = sizeof (struct sockaddr_in6); 

    sock=socket(AF_INET6, SOCK_DGRAM, 0); 
    if (sock < 0) error("Opening socket"); 

    bzero((char *)&server, length); 
    server.sin6_family=AF_INET6; 
    server.sin6_addr=in6addr_any; 
    server.sin6_port=htons(portNr); 

    inet_pton(AF_INET6, "fe80::21f:29ff:feed:2f7e", (void *)&server.sin6_addr.s6_addr); 
    //inet_pton(AF_INET6, "::1", (void *)&server.sin6_addr.s6_addr); 

    if (bind(sock,(struct sockaddr *)&server,length)<0) 
     error("binding"); 
    fromlen = sizeof(struct sockaddr_in6); 
    while (1) { 
     n = recvfrom(sock,buf,1024,0,(struct sockaddr *)&from,&fromlen); 
     if (n < 0) error("recvfrom"); 
     write(1,"Received a datagram: ",21); 
     write(1,buf,n); 
     n = sendto(sock,"Got your message\n",17, 
        0,(struct sockaddr *)&from,fromlen); 
     if (n < 0) error("sendto"); 
    } 
} 

quando ho compilare ed eseguire il codice di cui sopra ho ottenuto:Perché non è possibile legare presa ipv6 a un indirizzo linklocal

binding: Invalid argument 

e se il cambiamento di impegnare la ::1 e lasciare altra cosa invariati nel codice sorgente, il codice funziona! potresti dirmi cosa c'è di sbagliato nel mio codice? Grazie in anticipo.

risposta

13

Per gli indirizzi di collegamento locale, è inoltre necessario specificare l'ID di ambito dell'interfaccia di rete che è associato con l'indirizzo ... qualcosa di simile:

server.sin6_scope_id = 5; /* or whatever the scope ID is for the network interface you want to communicate over */ 

È possibile utilizzare getifaddrs() per trovare i vari ID di ambito disponibili sui sistemi e le interfacce di rete a cui corrispondono.

(Sì, è un dolore ... in alternativa potresti aggiungere qualcosa come "% en0" alla fine della stringa che passi a inet_pton(), e inet_pton() potrebbe fare il lavoro per te. .. Non sono sicuro che inet_pton() gestisca tale sintassi o meno)

+3

inet_pton non gestisce% se le stringhe sono accodate. È possibile utilizzare getaddrinfo per lavorare con% rappresentazioni di stringhe di indirizzo ip6 aggiunte. Vedi la pagina man http://linux.die.net/man/3/getaddrinfo –

Problemi correlati