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

için ipv6 soketi bağlamaya olamaz kaynak kodu, kod çalışır! Kodumu neyin yanlış olduğunu söyleyebilir misin? şimdiden teşekkürler.neden ben bir LINKLOCAL adrese

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

() bulmak için:

cevap

13

bağlantı yerel adresler için, ayrıca ... adresi ile ilişkili olan ağ arayüzünün kapsam kimliğini belirtmek için böyle bir şey gerekiyor sisteminizde bulunan çeşitli kapsam kimlikleri ve bunlara karşılık gelen ağ arabirimleri.

(Evet, bu bir acıdır ... alternatif olarak inet_pton() öğesine ilettiğiniz dizenin sonuna "% en0" gibi bir şey ekleyebilir ve inet_pton() sizin için iş yapabilir. .. inet_pton() bu sözdizimini işleyip işlemediğinden emin değilim)

+3

inet_pton, ek dizeler varsa% işlenmez. % Appended ip6 adres dize gösterimleri ile çalışmak için getaddrinfo kullanabilirsiniz. Man sayfasına bakın http://linux.die.net/man/3/getaddrinfo –