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

时间:2010-11-09 03:05:12

标签: c++ linux

我需要在webservices上找到本地机器的IP地址。在C#中,我有

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

我怎么能在C ++ Linux中做到这一点?

4 个答案:

答案 0 :(得分:3)

getifaddrs()将返回机器中所有接口的结构列表。手册页底部有一个例子。

您也可以将ioctl与SIOCGIFCONF参数一起使用。有一个例子here

答案 1 :(得分:2)

我最喜欢的方式:

  1. 制作UDP套接字
  2. 绑定到通配符
  3. 连接到1.2.3.4
  4. getsockname

1.2.3.4是一个不可能的IP地址,恰好被所有主机视为outobund。 (如果他们曾经做过1. allocateatable,你将不得不使用0.2.3.4,它可能会调用未定义的行为)。

当然,您需要为IPv6更新此内容。

答案 2 :(得分:1)

您的具体问题将在以下页面中解答:

但是这里有关于BSD套接字的更多信息。 Beej's Guide to Network Programming是了解更多信息的好地方。

答案 3 :(得分:0)

Linux中的C ++使用系统调用'getifaddr'来获取你网卡的所有接口。这里有两个函数和一个你需要的结构。

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

以下是用户Twelve47Get the IP address of the machine提供的示例,用于获取所有接口的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;
}