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

khi tôi biên dịch và chạy các mã trên tôi nhận:lý do tại sao tôi không thể ràng buộc ổ cắm ipv6 đến một địa chỉ linklocal

binding: Invalid argument 

và nếu thay đổi để ràng buộc ::1 và để lại điều khác không thay đổi trong mã nguồn, mã số hoạt động! vì vậy bạn có thể cho tôi biết có gì sai với mã của tôi không? cảm ơn trước.

Trả lời

13

Đối với các địa chỉ link-local, bạn cũng cần phải xác định phạm vi ID của giao diện mạng được liên kết với địa chỉ ... một cái gì đó như thế này:

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

Bạn có thể sử dụng getifaddrs() để tìm các ID phạm vi khác nhau có sẵn trên các hệ thống của bạn và các giao diện mạng mà chúng tương ứng.

(Có, đó là một nỗi đau ... bạn có thể nối thêm thứ gì đó như "% en0" vào cuối chuỗi bạn chuyển đến inet_pton() và inet_pton() có thể thực hiện công việc cho bạn. .. Tôi không chắc liệu inet_pton() có xử lý cú pháp đó hay không)

+3

inet_pton không xử lý% nếu chuỗi được nối thêm. Bạn có thể sử dụng getaddrinfo để làm việc với% đại diện chuỗi địa chỉ IP6 được nối thêm. Xem trang người dùng http://linux.die.net/man/3/getaddrinfo –

Các vấn đề liên quan