几种获取本机IPv6地址的方法
来源:互联网 发布:python turtle填色 编辑:程序博客网 时间:2024/04/27 12:41
如同获取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); }
0 0
- 几种获取本机IPv6地址的方法
- 获取本机IPV6地址
- c#中获取本机所有的IPv6地址
- java获取本机的所有ip地址 包括IPV6
- 获取本机所有ipv4, ipv6地址
- ipv6中配置地址的几种方法
- 提供一个C#获取本机IP地址的方法,不会出现获取的ip地址是IPV6或不能用的
- 获取本机mac地址的方法
- 获取本机IP地址的方法:
- 两种获取本机IP地址的方法
- c# 获取本机IP地址的两种方法
- Java获取本机IP列表的几种方法
- linux下获取本机ip地址,ipv4和ipv6
- linux下获取本机ip地址,ipv4和ipv6
- C#获取本机IPv4和IPv6地址
- C#笔记——获取本机ipv6地址
- 本机的Mac地址和Ipv6地址冲突
- C#获取本机IP(排除IPV6,仅获取IPV4)的方法
- Logistic regression概述
- Ubuntu下利用ant编译Android项目
- MVC入门
- 网络编程01
- gdb多线程调试
- 几种获取本机IPv6地址的方法
- abstract class和interface的区别详解
- 脸上长了黄褐斑怎么办
- Java Servlet调用Matlab算法
- BootCamp助理中没有“创建Windows7的USB安装盘”
- PHP如何响应移动端(android or ios)的post请求(使用file_get_contents)
- 奇异值分解(SVD)的之低秩近似和特征降维
- Java项目导出为可执行jar包,并在windows/linux下运行
- Win7机器上安装Ubuntu 14.0.4