发布日期:2018-03-26
使用C或者C++获取本机的IP地址+ 查看更多
使用C或者C++获取本机的IP地址
+ 查看更多
发布日期:2018-02-26 11:00
分类:CPlusPlus
浏览次数:194
这个问题几乎和之前询问获取本地计算机IP地址的问题相同。但是,我需要找到一个Linux机器的IP地址。
所以:我如何-在c++中以编程的方式-检测我的应用运行着的linux服务器的IP地址。这个服务器将有至少两个IP地址而我需要特殊的一个(在给定的网络中的一个(公共的一个))。
我确定有一个简单的函数来这样做-但是它在哪里?
为了使事情更清楚:
- 服务器将明显有“localhost”:127.0.0.1
- 服务器将有一个内部(管理)IP地址:172.16.x.x
- 服务器将有一个外部(公共)IP地址:80.190.x.x
我需要找到外部的IP地址来绑定我的应用程序。显然我也能绑定到INADDR_ANY(这确实也是我现在做的)。尽管我更愿意检测公共地址。
最佳答案
我发现ioctl解决方法在os X上有问题(这是POSIX兼容所以应该类似于linux)。可是getifaddress()将让你更轻松的做同样的事情,对于我来说它在os x 10.5上工作正常,应该在低版本上是一样的。
我做了一个简单的例子,下面将打印机器所有的IPv4地址,(你也应该检查getifaddrs是不是成功执行的,换句话说是否return 0)。
我更新了代码也能显示IPv6地址。#include#include #include #include #include #include int main (int argc, const char * argv[]) { struct ifaddrs * ifAddrStruct=NULL; struct ifaddrs * ifa=NULL; void * tmpAddrPtr=NULL; getifaddrs(&ifAddrStruct); for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) { if (!ifa->ifa_addr) { continue; } if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4 // is a valid IP4 Address tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr; char addressBuffer[INET_ADDRSTRLEN]; inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6 // is a valid IP6 Address tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr; char addressBuffer[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } } if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct); return 0; }