【问题标题】:Linux/C: Get ip address from device name? [duplicate]Linux/C:从设备名称中获取 IP 地址? [复制]
【发布时间】:2011-11-27 06:11:20
【问题描述】:

可能重复:
Get IP address of an interface on linux

如何从设备名称中获取 ip 地址(例如:eth0)?

【问题讨论】:

标签: c linux ip ip-address


【解决方案1】:

here。如果你需要在 C 程序中使用你的结果,你可以使用system(yourCommand) 然后fopen() stdout 来读取结果。

【讨论】:

  • 这个方法酷!您将您的应用程序暴露于安全漏洞、竞争条件(系统执行时间)并可能以应用程序权限运行错误的命令,以防有人在路径/环境中将“yourCommand”置于比您期望的系统更高的优先级跑步!看看命令 ifconfig 是如何做到的,并像那样做,使用系统调用而不是执行系统命令!
【解决方案2】:

免责声明:您的应用程序不应依赖此类信息。应用程序只能查看和使用 IP 地址。以太网设备是操作系统管道。请记住,您可能拥有与任何设备无关的 IP 地址,或者具有多个 IP 地址、多个协议(IPv4、IPv6)等的设备。重新检查您的应用程序的设计,如果它真的希望使用与以太网相关联的 IP 地址设备名称。

如果您仍想关联 IP 地址和以太网设备名称,请检查 getifaddrs(3),它是 netlink(7) 内核套接字的简单前端。

【讨论】:

  • 在某些情况下,指定设备名称而不是 IP 对应用程序有很大帮助,尤其是当应用程序从一台服务器移动到另一台服务器时,IP 不同,但预期的 NIC 名称始终相同。
  • getifaddrs 好。免责声明错误。大多数应用程序不应使用接口名称。有些被设计为与网络堆栈密切相关的,绝对应该(去阅读man dnsmasq
  • @VladLazarenko 这仍然是问题的错误解决方案。我猜你正在使用它来确定绑定()和监听()的地址,对吧?在这种情况下,您应该 bind() 到通配符地址 (INADDR_ANY),允许用户手动配置地址,或者使用 DNS 来确定应该绑定的地址。您假设一台 eth 设备始终只有一个地址,并且用户永远不需要绑定到任何界面中未列出的地址。这两个假设都是错误的。
  • @BenVoigt dnsmask 不是您的普通用户应用程序,您知道这一点; dnsmask 几乎是我在回答中提到的“操作系统管道”。显然,为网络堆栈提供服务的应用程序必须超越 IP 地址。根据我的经验,当普通程序员试图将 IP 地址与网络设备相关联时,他们的应用程序中存在设计问题。
  • @VladLazarenko,我给了你三个选项,当然其中一个,INADDR_ANY,并不适用于所有情况。对于那些,应该使用其他两个选项。你明白吗?请把你的人身攻击的论据留给自己,并小心推测你不认识的人的经历。另外,您对我的回答投反对票的理由很愚蠢。你根本不同意我说的一件事,不能提供理由...... tsc。
【解决方案3】:
ip addr

ip addr show eth0

还是过时的

ifconfig eth0

这是一个问题或 serverfault.com

【讨论】:

  • 由于作者将其标记为“c”,这实际上对于 stackoverflow.com 来说已经足够了,对于 serverfault.com(针对系统和网络管理问题)来说是不够的。
  • 请求者询问基于 c 的解决方案。基于 shell 的响应将起作用,但他必须通过管道输出到 ifconfig 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2011-01-28
  • 2020-09-02
  • 1970-01-01
相关资源
最近更新 更多