2010-03-16 4 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"); 
    } 
} 

, wenn ich den obigen Code kompilieren und ausführen Ich habe:warum kann ich nicht binden ipv6 Buchse an eine Adresse linklocal

binding: Invalid argument 

und wenn eine Änderung der ::1 und lassen andere Sache unverändert in die binden Quellcode, der Code funktioniert! Könnten Sie mir sagen, was mit meinem Code nicht stimmt? Danke im Voraus.

Antwort

13

Für Link-Local-Adressen, müssen Sie auch die Scope-ID der Netzwerkschnittstelle angeben, die mit der Adresse ... so etwas wie dies verbunden ist:

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

Sie getifaddrs() verwenden kann, finden die verschiedenen Bereichs-IDs, die auf Ihren Systemen verfügbar sind, und die Netzwerkschnittstellen, denen sie entsprechen.

(Ja, es ist ein Schmerz ... alternativ könnten Sie etwas wie "% en0" an das Ende der Zeichenfolge anfügen, die Sie an inet_pton() übergeben, und inet_pton() könnte die Arbeit für Sie erledigen. .. Ich bin mir nicht sicher, ob inet_pton() diese Syntax behandelt oder nicht)

+3

inet_pton behandelt nicht% wenn angehängte Zeichenfolgen. Sie können getaddrinfo verwenden, um mit% angefügten ip6-Adresszeichenfolgenrepräsentationen zu arbeiten. Siehe Manpage http://linux.die.net/man/3/getaddrinfo –

Verwandte Themen