篇一:Linux 获取本机IP地址
IP地址分为IPv4 和IPv6,本文只验证了IPv4的获取,至于IPv6还没有验证。
说明:
family = AT_INET :IPv4
family = AT_INET6:IPv6
address: 提取得到的IP地址所要保存的地址
size =strlen(sampleIP) 192.168.123.128
MAX_IPv4 =15
某些头文件应在其他方面,在本程序中没用得上。不过不影响程序的编译。
program list:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <net/if.h>
#include <ifaddrs.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
int GetIP_v4_and_v6_linux(int family, char *address, int size)
{
struct ifaddrs *ifap0, *ifap;
char buf[NI_MAXHOST];
char *interface = "eth0";
struct sockaddr_in *addr4;
struct sockaddr_in6 *addr6;
int ret;
if( NULL == address )
{
return -1;
}
if(getifaddrs(&ifap0))
{
return -1;
}
for( ifap = ifap0; ifap != NULL; ifap=ifap->ifa_next)
{
if(strcmp(interface, ifap->ifa_name) != 0) continue;
if(ifap->ifa_addr==NULL) continue;
if ((ifap->ifa_flags & IFF_UP) == 0) continue;
if(family != ifap->ifa_addr->sa_family) continue;
if(AF_INET == ifap->ifa_addr->sa_family)
{
addr4 = (struct sockaddr_in *)ifap->ifa_addr;
if ( NULL != inet_ntop(ifap->ifa_addr->sa_family,
(void *)&(addr4->sin_addr), buf, NI_MAXHOST) )
{
if(size < strlen(buf) ) break;
strcpy(address, buf);
printf("IPv4=%s\n",address);//testing
freeifaddrs(ifap0);
return 0;
}
else break;
}
else if(AF_INET6 == ifap->ifa_addr->sa_family)
{
addr6 = (struct sockaddr_in6 *)ifap->ifa_addr;
if(IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr))
{ continue;
}
if(IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr))
{continue;
}
if(IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr))
{ continue;
}
if(IN6_IS_ADDR_UNSPECIFIED(&addr6->sin6_addr))
{ continue;
}
if(IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr))
{continue;
}
if ( NULL != inet_ntop(ifap->ifa_addr->sa_family,
(void *)&(addr6->sin6_addr), buf, NI_MAXHOST) )
{ if(size < strlen(buf) ) break;
strcpy(address, buf);
printf("IPv6=%s\n",address);//testing
freeifaddrs(ifap0);
return 0;
}
else break;
}
}
}
void * getIPv4()
{
static int SIZE ;
static char IP[64];
char *sampleIPv4="192.168.123.128";
SIZE = strlen(sampleIPv4);
GetIP_v4_and_v6_linux(AF_INET ,IP ,SIZE);
printf("IP=%s\n",IP);
return IP;
}
本程序非原创,也不清楚原创作者是何人。本人只是拿来修改,并应用在实际的工程项目中去。感谢原创作者和网络上的无私奉献的 Linux工作者!让我们共同发扬Linux的精神!
Enjoy it!
篇二:获取linux设备的ip地址(shell实现)
Shell中获取当前IP地址
ifconfig返回的信息中包括IP地址,但要在Shell中获取当前IP地址,则要麻烦一些 获取方法,由于不同系统中ifconfig返回信息的格式有一定差别,故分开讨论:
[1]Linux:
LC_ALL=C ifconfig |grep 'inetaddr:'| grep -v '127.0.0.1' |cut -d: -f2 | awk'{ print $1}'
LC_ALL=C 英文输出
ifconfig输出ip相关信息
# LC_ALL=C ifconfig
eth0Link encap:EthernetHWaddr C2:AC:C3:E7:4A:33
inet addr:192.168.1.247 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:84080 errors:0 dropped:80 overruns:0 frame:0
TX packets:3595264 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14627750 (13.9 MiB) TX bytes:417627051 (398.2 MiB)
Interrupt:27
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:127 errors:0 dropped:0 overruns:0 frame:0
TX packets:127 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0RX bytes:18079 (17.6 KiB) TX bytes:18079 (17.6 KiB)
grep 'inetaddr:' 截取包含ip的那两行
# LC_ALL=C ifconfig|grep "inetaddr:"
inet addr:192.168.1.247 Bcast:0.0.0.0 Mask:255.255.255.0
inet addr:127.0.0.1 Mask:255.0.0.0
grep -v '127.0.0.1'去掉本地指向的那行
# LC_ALL=C ifconfig|grep "inetaddr:"|grep -v "127.0.0.1"
inet addr:192.168.1.247 Bcast:0.0.0.0 Mask:255.255.255.0
cut -d: -f2 -d: 以:分割字符串 -f2:取第二组数据
# LC_ALL=C ifconfig|grep "inetaddr:"|grep -v "127.0.0.1"|cut -d: -f2
192.168.1.247 Bcast
awk '{ print $1}' $1 表示默认以空格分割的第一组同理 $2表示第二组
# LC_ALL=C ifconfig|grep "inetaddr:"|grep -v "127.0.0.1"|cut -d: -f2|awk '{print $1}' 192.168.1.247
# LC_ALL=C ifconfig|grep "inetaddr:"|grep -v "127.0.0.1"|cut -d: -f2|awk '{print $2}' Bcast
[2]FreeBSD/OpenBSD:
LC_ALL=C ifconfig |grep -E 'inet.[0-9]' | grep -v '127.0.0.1' |awk '{ print $2}'
[3]Solaris:
LC_ALL=C ifconfig -a | grepinet | grep -v '127.0.0.1' |awk '{ print $2}'
三段代码的原理类似,都是先获取含有IP的行,再去掉含有127.0.0.1的行,最后获取IP所在的列。
篇三:试试Linux下的ip命令
试试Linux下的ip命令,ifconfig已经过时了
文档链接:http://os.51cto.com/art/201406/441461.htm
Linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig是net-tools中已被废弃使用的一个命令,许多年前就已经没有维护了。
AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载!
Linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig是net-tools中已被废弃使用的一个命令,许多年前就已经没有维护了。iproute2套件里提供了许多增强功能的命令,ip命令即是其中之一。
要安装ip,请点击这里下载iproute2套装工具 。不过,大多数Linux发行版已经预装了iproute2工具。
从某种意义上说,iproute工具集几乎可以替代掉net-tools工具集,具体的替代方案是这样的:
你也可以使用git命令来下载最新源代码来编译:
1. $ git clone
https://kernel.googlesource.com/pub/scm/linux/kernel/git/shemminger/iproute2.git
设置和删除Ip地址
要给你的机器设置一个IP地址,可以使用下列ip命令:
1. $ sudo ip addr add 192.168.0.193/24 dev wlan0
请注意IP地址要有一个后缀,比如/24。这种用法用于在无类域内路由选择(CIDR)中来显示所用的子网掩码。在这个例子中,子网掩码是255.255.255.0。
在你按照上述方式设置好IP地址后,需要查看是否已经生效。
1. $ ip addr show wlan0
你也可以使用相同的方式来删除IP地址,只需用del代替add。
1. $ sudo ip addr del 192.168.0.193/24 dev wlan0
列出路由表条目
ip命令的路由对象的参数还可以帮助你查看网络中的路由数据,并设置你的路由表。第一个条目是默认的路由条目,你可以随意改动它。
在这个例子中,有几个路由条目。这个结果显示有几个设备通过不同的网络接口连接起来。它们包括WIFI、以太网和一个点对点连接。
1. $ ip route show
假设现在你有一个IP地址,你需要知道路由包从哪里来。可以使用下面的路由选项(译注:列出了路由所使用的接口等):
1. $ ip route get 10.42.0.47
更改默认路由
要更改默认路由,使用下面ip命令:
1. $ sudo ip route add default via 192.168.0.196
显示网络统计数据
使用ip命令还可以显示不同网络接口的统计数据。
当你需要获取一个特定网络接口的信息时,在网络接口名字后面添加选项ls即可。使用多个选项-s会给你这个特定接口更详细的信息。特别是在排除网络连接故障时,这会非常有用。
1. $ ip -s -s link ls p2p1
ARP条目
地址解析协议(ARP)用于将一个IP地址转换成它对应的物理地址,也就是通常所说的MAC地址。使用ip命令的neigh或者neighbour选项,你可以查看接入你所在的局域网的设备的MAC地址。
1. $ ip neighbour
监控netlink消息
也可以使用ip命令查看netlink消息。monitor选项允许你查看网络设备的状态。比如,所在局域网的一台电脑根据它的状态可以被分类成REACHABLE或者STALE。使用下面的命令:
1. $ ip monitor all
激活和停止网络接口
你可以使用ip命令的up和down选项来激某个特定的接口,就像ifconfig的用法一样。 在这个例子中,当ppp0接口被激活和在它被停止和再次激活之后,你可以看到相应的路由表条目。这个接口可能是wlan0或者eth0。将ppp0更改为你可用的任意接口即可。
1. $ sudo ip link set ppp0 down 2.
3. $ sudo ip link set ppp0 up
获取帮助