为了账号安全,请及时绑定邮箱和手机立即绑定

获取机器的ip地址

获取机器的ip地址

四季花海 2019-07-17 09:52:17
获取机器的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(实际上这就是我目前所做的)。不过,我更希望能探测到公共地址。
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

  1. 创建一个套接字。
  2. 表演

    ioctl(<socketfd>, SIOCGIFCONF, (struct ifconf)&buffer);

朗读,阅读/usr/include/linux/if.h获取有关ifconfifreq结构。这应该会给出系统上每个接口的IP地址。亦读/usr/include/linux/sockios.h为了更多的ioctls。


查看完整回答
反对 回复 2019-07-17
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

正如ZanLnyx所说,它使用本地路由表来查找用于连接到特定外部主机的以太网接口的IP地址。通过使用连接的UDP套接字,您可以在不实际发送任何数据包的情况下获取信息。此方法要求您选择特定的外部主机。在大多数情况下,任何知名的公共IP都应该做到这一点。为此,我喜欢Google的公共DNS服务器地址8.8.8.8,但有时您可能希望选择不同的外部主机IP。下面是一些说明完整方法的代码。

void GetPrimaryIp(char* buffer, size_t buflen) {
    assert(buflen >= 16);

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    assert(sock != -1);

    const char* kGoogleDnsIp = "8.8.8.8";
    uint16_t kDnsPort = 53;
    struct sockaddr_in serv;
    memset(&serv, 0, sizeof(serv));
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr = inet_addr(kGoogleDnsIp);
    serv.sin_port = htons(kDnsPort);

    int err = connect(sock, (const sockaddr*) &serv, sizeof(serv));
    assert(err != -1);

    sockaddr_in name;
    socklen_t namelen = sizeof(name);
    err = getsockname(sock, (sockaddr*) &name, &namelen);
    assert(err != -1);

    const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, buflen);
    assert(p);

    close(sock);}


查看完整回答
反对 回复 2019-07-17
  • 3 回答
  • 0 关注
  • 563 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信