幾種獲取本機IPv6地址的方法

      如同獲取IPv4的地址一般,獲取IPv6也是可以通過使用網卡信息來得到IPv6的地址,也可以給一個多播地址發送數據包然後獲取IPv6的地址。在IPv4通過iotcl函數是可以獲取本主機的IPv4的地址的,但是本樓主使用iotcl函數來獲取IPv6的地址就沒成功過,經查證,沒有看到使用iotcl獲取IPv6地址成功的Demo,所以如果想使用iocl函數來獲取IPv6地址,我勸你還是做好心理準備哈!不多說,直接上代碼了,一下就是我實現的兩種獲取IPv6地址的方法。        

mynet.h

#include  <netinet/in.h>

#include  <sys/param.h>
#include  <sys/stat.h>
#include  <sys/ioctl.h>
#include  <sys/socket.h>
#include  <sys/socket.h>
#include  <sys/time.h>
#include  <sys/file.h>
#include  <sys/types.h>

#include   <netinet/ip.h>
#include  <arpa/ftp.h>
#include  <arpa/inet.h>
#include  <arpa/telnet.h>
 
#include  <stdio.h>
#include  <signal.h>
#include  <string.h>
#include  <net/if.h>
#include  <stdlib.h>
#include  <unistd.h>
#include  <error.h>
#include  <netdb.h>
#include  <ifaddrs.h> 
#include  <errno.h> 

方法一:byeth0getipv6.c

#include "mynet.h"
      
int  main(int argc, char *argv[]){  
        struct ifaddrs *ifaddr, *ifa;  
        int family, s;  
        char host[NI_MAXHOST];  
	char* ifaname;     

	printf("NI_MAXHOST:%d\n",NI_MAXHOST);	 
        if (getifaddrs(&ifaddr) == -1) {  
            printf("getifaddrs\n");  
            return -1;  
        }  
      
        for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {  
            if (ifa->ifa_addr == NULL)  
                continue;  
      
            family = ifa->ifa_addr->sa_family;  
            ifaname = ifa->ifa_name; 
            if (family == AF_INET6 && memcmp(ifaname, "eth0", 4) == 0 ) {
                s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6),  
                        host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);  
                if (s != 0) {  
                    printf("getnameinfo() failed: %s\n", gai_strerror(s));  
                    return -1;  
                }
		if (strchr(host, '%') == NULL){
			printf("%s IPv6 addr:%s\n", ifa->ifa_name, host);
		}
	    }else{
		continue;
  	    }      
        }  
      
        freeifaddrs(ifaddr);
	return 0;
}  
方法二:bymulgetipv6.c

#include "mynet.h"

int main(){
	const char* muladdr = "ff0e::2";
	int sockfd;
	int len;
	int on = 1;
	struct sockaddr_in6 iface_out;
	struct sockaddr_in6 remote;
	char address[45];
	memset(&remote, 0, sizeof( struct sockaddr_in6  ));

	remote.sin6_family = AF_INET6;
	inet_pton(AF_INET6, muladdr, &remote.sin6_addr);
	remote.sin6_port = htons(10086);

	memset(&iface_out, 0, sizeof( struct sockaddr_in6));
	sockfd = socket(AF_INET6, SOCK_DGRAM, 0);
	if ( setsockopt(sockfd , SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) == -1 ) {
		perror("DEBUG: [get_output_if] setsockopt(SOL_SOCKET, SO_BROADCAST");
		close(sockfd);
		return -1;
	}
	if ( connect(sockfd, (struct sockaddr *) &remote, sizeof(struct sockaddr_in6)) == -1)
	{
		perror("IPv6 DEBUG: [get_output_if] connect");
		close(sockfd);
		return -1;
	}

	len = sizeof(iface_out);
	if (getsockname(sockfd, (struct sockaddr *) &iface_out, &len) == -1) {
		perror("DEBUG: [get_output_if] getsockname");
		close(sockfd);
		return -1;
	}

	close(sockfd);

	if (iface_out.sin6_addr.s6_addr == 0) {	/* what is this case?? */
		return -1;
	}
	
	inet_ntop(AF_INET6, (const void *) &iface_out.sin6_addr, address, 45);
	printf("IPV6 address:%s\n",address); 
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章