获取Linux上接口的IP地址


67

如何从C代码获取Linux上接口的IPv4地址?

例如,我想获取分配给eth0的IP地址(如果有)。

Answers:


84

尝试这个:

代码示例是从这里获取的


1
为什么存在细分错误?
user138126

7
如果更改SIOCGIFADDRSIOCGIFNETMASK,则可以获取接口的网络掩码。
Craig McQueen 2014年

5
值得检查的返回值ioctl(),如果非零,请检查的值errno
Craig McQueen 2014年

不需要IFNAMSIZ-1,而是IFNAMSIZ足够了。万一发生溢出,strncpy将使用最后一个字节终止字符串。
zapstar

3
@zapstar我认为这是不正确的。从strncpy联机帮助页:警告:如果src的前n个字节中没有空字节,则放置在dest中的字符串将不以空值结尾。
马克·史密斯

42

除了ioctl()方法,Filip还演示了您可以使用getifaddrs()。手册页底部有一个示例程序。


1
getifaddrs似乎非常全面。其他方法将仅给出每个接口的主要或第一个地址。
MarkR 2010年

1
太棒了,从来不知道!
马特·乔纳

1
我在eth0上没有任何连接,如果使用其他方法,它将输出128.226.115.183,这是错误的。但是,此方法表明eth0上没有提供可靠输出的连接
Angs

25

如果您要查找特定接口的地址(IPv4),请说wlan0,然后尝试使用getifaddrs()的这段代码:

您可以将eth0替换为wlan0,将eth0替换为以太网,将lo替换为本地回送。

可以在此处找到所使用的数据结构的结构和详细说明。

要了解有关C中链表的更多信息,此页面将是一个很好的起点。


我们为什么需要getnameinfo
abhiarora

@abhiarora在文档中-它以与协议无关的方式将套接字地址转换为相应的主机和服务。请注意,host稍后打印的参数值在getnameinfo函数内部提供。
sjsam '20

为什么ifa->ifa_addr == NULL 还不够?我不确定为什么我们需要getnameinfoifa_addr是内部地址。
Abhiarora

3

我的2美分:即使是iOS,相同的代码也可以使用:

我只是删除了针对wlan0的测试以查看数据。ps您可以删除“家庭”


3
可爱。这绝对是纯C.
j3141592653589793238

2

如果您不介意二进制大小,则可以使用iproute2作为库。

iproute2-as-lib

优点:

  • 无需编写套接字层代码。
  • 可以获得有关网络接口的更多甚至更多信息。与iproute2工具相同的功能。
  • 简单的API接口。

缺点:

  • iproute2-as-lib库的大小很大。约500kb。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.