2010-03-16 50 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

相关问题