如何在没有Internet连接的情况下获取我的外部ip(主接口),没有eth0且没有任何使用C

时间:2017-07-28 16:04:51

标签: c linux networking

大多数示例使用例如互联网连接,例如谷歌dns。这是改变方式,因为如果没有本地网络中的互联网,这将无效。

另外一些例子使用了分析“eth0”这样的坏方法。这种非常糟糕的方式就像这个硬编码字符串一样。例如。在我的电脑中这不起作用,因为我的addapter名称是“ens160”而不是“eth0”:

ens160    Link encap:Ethernet  HWaddr 00:50:56:ba:75:ea  
          inet addr:192.168.0.237  Bcast:192.168.1.255  Mask:255.255.254.0
          inet6 addr: ... Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:205280 errors:0 dropped:1 overruns:0 frame:0
          TX packets:68958 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:266539618 (266.5 MB)  TX bytes:4771936 (4.7 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:825 errors:0 dropped:0 overruns:0 frame:0
          TX packets:825 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:74843 (74.8 KB)  TX bytes:74843 (74.8 KB)

我在localnetwork中的地址是“192.168.0.237”,这是ens160。这是默认接口和IP,当某个库创建套接字(例如microhttpd或任何其他)时,它在系统中使用。如何使用标准的linux库/函数检索它?

提前谢谢

1 个答案:

答案 0 :(得分:0)

如果您只想发现默认适配器的已分配IP地址,例如192.168.0.237,致电getifaddrs并枚举每个地址。这是ifconfig通常显示的适配器列表,其中包含网关和网络掩码的相关信息。过滤掉标记为IFF_LOOPBACK或没有IFF_UP的广告。一些示例代码here

如果您有多个此类地址,则需要检查路由表并找到默认路由(目标IP地址为0.0.0.0的路由)。

jselbie@ubuntu:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.254.2   0.0.0.0         UG    100    0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens33
192.168.254.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

第一个条目,即目标路由为0.0.0.0的条目,是您的默认路由,并通过ens33适配器发送。如果有多个默认路由,则使用具有较低metric字段的路由。在我的例子中,0.0.0.0路由的接口是ens33。如上所述,可以通过调用ens33来发现getifaddrs的IP地址。 (引用ifaddrs的枚举列表中的ifa_name字段。)

至于在C中以编程方式枚举路由表,我实际上不记得如何做到这一点。快速的互联网搜索建议您可以使用NETLINK套接字。我也会参考route命令的源代码。