在C++ Linux中获取本地IP地址

3

我需要找到一个Web服务本地机器的IP地址。在C#中,我使用如下代码:

ManagementObjectSearcher objC = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
ManagementObjectCollection objCollection = objC.Get();

我该如何在C++ Linux中实现它?

4个回答

3

getifaddrs()函数将返回机器上所有接口的结构列表。该手册页面底部有一个示例。

您还可以使用带有SIOCGIFCONF参数的ioctl函数。 这里有一个示例。


3

我最喜欢的方法:

  1. 创建一个UDP套接字
  2. 绑定到通配符
  3. 连接到1.2.3.41.1.1.1
  4. 获取套接字名称

1.2.3.4 一个不可能的IP地址,所有主机都会将其视为出站。1.1.1.1是CloudFlare的DNS服务器,具有组播路由,因此您的主机不能是它。(如果他们曾经使1.可分配,您将不得不使用0.2.3.4,这可能会引发未定义的行为)。

当然,您需要针对IPv6进行更新。


1

0

在Linux中使用系统调用“getifaddr”获取您的网络接口的所有接口的C++。这里有两个函数和一个结构体你需要。

struct ifaddrs{
    struct ifaddrs *ifa_next;   /* Pointer to the next structure.  */
    char *ifa_name;     /* Name of this network interface.  */
    struct sockaddr *ifa_addr;  /* Network address of this interface.  */
    ...
}
int getifaddrs(struct ifaddrs **ifap); //to get all interface config fed to ifap
void freeifaddrs(struct ifaddrs *ifa); //to free ifa

以下是用户Twelve47获取机器IP地址提供的示例,用于获取所有接口的IPv4和IPv6地址:

#include <stdio.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h> 
#include <string.h> 
#include <arpa/inet.h>

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->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': %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': %s\n", ifa->ifa_name, addressBuffer); 
        } 
    }
    if (ifAddrStruct!=NULL) 
        freeifaddrs(ifAddrStruct);//remember to free ifAddrStruct
    return 0;
}

如果计算机有多个网络卡和多个接口,但只有一个可以连接到公共互联网,会发生什么? - user2284570
2
从https://dev59.com/c3VC5IYBdhLWcg3wsTVi上复制粘贴得很好。 - Didac Perez Parera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接