好问题
Good  Question
  • 首 页
  • 问题
    • PHP
    • JAVA
    • CPlusPlus
    • C#
    • SQL
  • 关 于
  • 联 系
使用C或者C++获取本机的IP地址 关闭 返回上一级  

使用C或者C++获取本机的IP地址
+ 查看更多

发布日期:2018-02-26 11:00
分类:CPlusPlus
浏览次数:155
这个问题几乎和之前询问获取本地计算机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;
}
上一篇如何从一个字符串中移除某个字符?
MAC下有什么好的C++编辑器(IDE)吗?下一篇
下一篇MAC下有什么好的C++编辑器(IDE)吗?

最新文章

  • 函数`__construct`用来干嘛的
    发布日期:2018-03-26
  • 通过访客的IP得到他们的地区
    发布日期:2018-03-26
  • 合并两个PHP对象的最好的方法是什么?
    发布日期:2018-03-26
  • 该如何把一该如何把一个对象转化成数组?
    发布日期:2018-03-26
  • 什么是输出缓冲区?
    发布日期:2018-03-26
  • 在PHP中怎么把用逗号分隔的字符串分隔在一个数组里?
    发布日期:2018-03-26
  • 在PHP中使用foreach循环时查找数组的最后一个元素
    发布日期:2018-03-26
关于好问
收集整理一些有用的问题和回答,造福中国的程序旺和IT喵们!
友情链接
起飞页 
相关信息
版权声明
Copyright © 2016 - 2022  苏州卡达网络科技有限公司 备案号:苏ICP备09008221号