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

當我編譯和運行上面的代碼我:爲什麼我不能IPv6套接字綁定到一個LINKLOCAL地址

binding: Invalid argument 

,如果更改綁定::1並保留其他的東西在不變源代碼,代碼 工程!那麼你能告訴我我的代碼有什麼問題嗎?提前致謝。

回答

13

對於鏈路本地地址,你還需要指定與該地址相關聯的網絡接口的範圍ID ......是這樣的:

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

您可以使用getifaddrs()找到系統上可用的各種範圍ID以及它們對應的網絡接口。或者你可以在你傳遞給inet_pton()的字符串末尾追加類似「%en0」的東西,而inet_pton()可能會爲你做這件事。 ..我不確定inet_pton()是否處理​​該語法)

+3

inet_pton不處理%,如果附加的字符串。您可以使用getaddrinfo處理%附加的ip6地址字符串表示。請參閱手冊頁http://linux.die.net/man/3/getaddrinfo – 2013-02-06 11:36:28

相關問題