Linux C语言 获取本机(所有网卡)IP地址(IPV4)
2014-05-16 09:56
330 查看
代码:
#include <sys/ioctl.h> #include <net/if.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> int get_local_ip(char *ip) { int fd, intrface, retn = 0; struct ifreq buf[INET_ADDRSTRLEN]; struct ifconf ifc; if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) { ifc.ifc_len = sizeof(buf); // caddr_t,linux内核源码里定义的:typedef void *caddr_t; ifc.ifc_buf = (caddr_t)buf; if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc)) { intrface = ifc.ifc_len/sizeof(struct ifreq); while (intrface-- > 0) { if (!(ioctl(fd, SIOCGIFADDR, (char *)&buf[intrface]))) { ip=(inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr)); printf("IP:%s\n", ip); } } } close(fd); return 0; } } int main() { char ip[64]; memset(ip, 0, sizeof(ip)); get_local_ip(ip); return 0; }
编译:
[root@localhost get_ip]# gcc -Wall -g ip.c
[root@localhost get_ip]# ./a.out
IP:192.168.2.53
IP:192.168.2.55
IP:127.0.0.1
代码解析:
<netinet/in.h>中定义了 #define INET_ADDRSTRLEN 16
ifreq、ifconf 、ioctl参考:/article/10924844.html
2、通过枚举网卡打印当前所有网卡
代码:
#include <stdio.h> #include <ifaddrs.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> int get_local_ip(char *ip) { struct ifaddrs *ifAddrStruct; void *tmpAddrPtr=NULL; getifaddrs(&ifAddrStruct); while (ifAddrStruct != NULL) { if (ifAddrStruct->ifa_addr->sa_family==AF_INET) { tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr; inet_ntop(AF_INET, tmpAddrPtr, ip, INET_ADDRSTRLEN); printf("%s IP Address:%s\n", ifAddrStruct->ifa_name, ip); } ifAddrStruct=ifAddrStruct->ifa_next; } //free ifaddrs freeifaddrs(ifAddrStruct); return 0; } int main() { char ip[16]; memset(ip, 0, sizeof(ip)); get_local_ip(ip); return 0; }
编译:
[root@localhost get_ip]# gcc -Wall -g ip.c
[root@localhost get_ip]# ./a.out
lo IP Address:127.0.0.1
eth0 IP Address:192.168.2.55
eth1 IP Address:192.168.2.53
代码解析:
API接口可查看man 7 netdevice
3、多网卡情况下,将所有IP地址以字符串形式打印出,用逗号(“,”)隔开,形式如:“127.0.0.1,192.168.2.55,192.168.2.53”
代码:
#include <stdio.h> #include <ifaddrs.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> int get_local_ip(char *ips) { struct ifaddrs *ifAddrStruct; void *tmpAddrPtr=NULL; char ip[INET_ADDRSTRLEN]; int n = 0; getifaddrs(&ifAddrStruct); while (ifAddrStruct != NULL) { if (ifAddrStruct->ifa_addr->sa_family==AF_INET) { tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr; inet_ntop(AF_INET, tmpAddrPtr, ip, INET_ADDRSTRLEN); printf("%s IP Address:%s\n", ifAddrStruct->ifa_name, ip); if (n == 0){ strncat(ips, ip, INET_ADDRSTRLEN); } else { strncat(ips, ",", 1); strncat(ips, ip, INET_ADDRSTRLEN); } n++; } ifAddrStruct=ifAddrStruct->ifa_next; } //free ifaddrs freeifaddrs(ifAddrStruct); return 0; } int main() { char ip[64]; memset(ip, 0, sizeof(ip)); get_local_ip(ip); printf("IP:%s\n", ip); return 0; }
编译:
[root@localhost get_ip]# gcc -Wall -g ip.c
[root@localhost get_ip]# ./a.out
lo IP Address:127.0.0.1
eth0 IP Address:192.168.2.55
eth1 IP Address:192.168.2.53
IP:127.0.0.1,192.168.2.55,192.168.2.53
4、多网卡情况下,将多个ip地址放入字符串数组中(去掉"127.0.0.1"地址)
代码:
#include <stdio.h> #include <ifaddrs.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> int get_local_ip(char *ip_list) { struct ifaddrs *ifAddrStruct; void *tmpAddrPtr; char ip[INET_ADDRSTRLEN]; int n = 0; getifaddrs(&ifAddrStruct); while (ifAddrStruct != NULL) { if (ifAddrStruct->ifa_addr->sa_family==AF_INET) { tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr; inet_ntop(AF_INET, tmpAddrPtr, ip, INET_ADDRSTRLEN); if (strcmp(ip, "127.0.0.1") != 0) { // printf("%s IP Address:%s\n", ifAddrStruct->ifa_name, ip); if (n == 0){ memcpy(ip_list, ip, INET_ADDRSTRLEN); } else { memcpy(ip_list+INET_ADDRSTRLEN, ip, INET_ADDRSTRLEN); } n++; } } ifAddrStruct=ifAddrStruct->ifa_next; } //free ifaddrs freeifaddrs(ifAddrStruct); return n; } int main() { char ip[3][INET_ADDRSTRLEN]; memset(ip, 0, sizeof(ip)); int n; for (n=get_local_ip(*ip); n>0; n--) { printf("IP:%s\n", ip[n-1]); } return 0; }
编译:
[root@localhost get_ip]# gcc -Wall -g ip.c
[root@localhost get_ip]# ./a.out
IP:192.168.2.53
IP:192.168.2.55
相关文章推荐
- Linux C语言 获取本机(所有网卡)IP地址(IPV4)
- Linux C语言 获取本机(所有网卡)IP地址(IPV4)
- 获取本机(所有网卡)IP地址(IPV4)
- Linux 接口地址的获取-暨获取本地IP地址(所有地址,包括IPv4,IPV6,MAC 地址)
- 获取所有连接本机的IP地址、网卡物理地址、数据库名、程序名等
- JAVA 获取本地所有的IP地址,多网卡多IP,单网卡多个IP
- linux C语言获取网卡对应IP地址
- C语言获取本地所有网卡的ip地址及MAC信息
- Linux 接口地址的获取-暨获取本地IP地址(所有地址,包括IPv4,IPV6,MAC 地址)
- c# 多网卡获取ipv4 ip地址办法列举
- java获取所有网卡和ip地址
- 多网卡机器列出所有的IP地址
- javascript获取客户端网卡MAC地址和IP地址和计算机名
- 设置网卡为自动获取IP地址的cmd命令
- 关于从客户端获取IP地址和网卡地址的方法
- C# 获取网卡IP地址
- javascript获取客户端网卡MAC地址和IP地址和计算机名
- javascript获取客户端网卡MAC地址和IP地址和计算机名
- javascript获取客户端网卡MAC地址和IP地址和计算机名
- javascript获取客户端网卡MAC地址和IP地址和计算机名