猿问

获取机器的ip地址

获取机器的ip地址

这个问题几乎与先前提出的问题相同。获取本地计算机的IP地址-问题。但是,我需要找到Linux机器.

那么:如何以编程方式在C+-检测我的应用程序正在运行的Linux服务器的IP地址。服务器至少有两个IP地址,我需要一个特定的IP地址(给定网络中的IP地址(公共地址)。

我相信有一个简单的功能可以做到-但是在哪里呢?


为了让事情更清楚一点:

  • 服务器显然有“localhost”:127.0.0.1
  • 服务器将有一个内部(管理)IP地址:172.16.x.x
  • 服务器将具有外部(公共)IP地址:80.190.x.x

我需要找到外部IP地址来将我的应用程序绑定到它。显然,我也可以绑定到INADDR_ANY(实际上这就是我目前所做的)。不过,我更希望能探测到公共地址。


四季花海
浏览 564回答 3
3回答

慕尼黑5688855

创建一个套接字。表演ioctl(<socketfd>, SIOCGIFCONF, (struct ifconf)&buffer);朗读,阅读/usr/include/linux/if.h获取有关ifconf和ifreq结构。这应该会给出系统上每个接口的IP地址。亦读/usr/include/linux/sockios.h为了更多的ioctls。

幕布斯7119047

正如ZanLnyx所说,它使用本地路由表来查找用于连接到特定外部主机的以太网接口的IP地址。通过使用连接的UDP套接字,您可以在不实际发送任何数据包的情况下获取信息。此方法要求您选择特定的外部主机。在大多数情况下,任何知名的公共IP都应该做到这一点。为此,我喜欢Google的公共DNS服务器地址8.8.8.8,但有时您可能希望选择不同的外部主机IP。下面是一些说明完整方法的代码。void&nbsp;GetPrimaryIp(char*&nbsp;buffer,&nbsp;size_t&nbsp;buflen)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;assert(buflen&nbsp;>=&nbsp;16); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;sock&nbsp;=&nbsp;socket(AF_INET,&nbsp;SOCK_DGRAM,&nbsp;0); &nbsp;&nbsp;&nbsp;&nbsp;assert(sock&nbsp;!=&nbsp;-1); &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char*&nbsp;kGoogleDnsIp&nbsp;=&nbsp;"8.8.8.8"; &nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;kDnsPort&nbsp;=&nbsp;53; &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sockaddr_in&nbsp;serv; &nbsp;&nbsp;&nbsp;&nbsp;memset(&serv,&nbsp;0,&nbsp;sizeof(serv)); &nbsp;&nbsp;&nbsp;&nbsp;serv.sin_family&nbsp;=&nbsp;AF_INET; &nbsp;&nbsp;&nbsp;&nbsp;serv.sin_addr.s_addr&nbsp;=&nbsp;inet_addr(kGoogleDnsIp); &nbsp;&nbsp;&nbsp;&nbsp;serv.sin_port&nbsp;=&nbsp;htons(kDnsPort); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;err&nbsp;=&nbsp;connect(sock,&nbsp;(const&nbsp;sockaddr*)&nbsp;&serv,&nbsp;sizeof(serv)); &nbsp;&nbsp;&nbsp;&nbsp;assert(err&nbsp;!=&nbsp;-1); &nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;name; &nbsp;&nbsp;&nbsp;&nbsp;socklen_t&nbsp;namelen&nbsp;=&nbsp;sizeof(name); &nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&nbsp;getsockname(sock,&nbsp;(sockaddr*)&nbsp;&name,&nbsp;&namelen); &nbsp;&nbsp;&nbsp;&nbsp;assert(err&nbsp;!=&nbsp;-1); &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char*&nbsp;p&nbsp;=&nbsp;inet_ntop(AF_INET,&nbsp;&name.sin_addr,&nbsp;buffer,&nbsp;buflen); &nbsp;&nbsp;&nbsp;&nbsp;assert(p); &nbsp;&nbsp;&nbsp;&nbsp;close(sock);}
随时随地看视频慕课网APP
我要回答