C++ 获取C+中的本地IP地址+;Linux

C++ 获取C+中的本地IP地址+;Linux,c++,linux,C++,Linux,我需要在一个Web服务上找到本地机器的IP地址。在C#中,我有 ifa\U next){ 如果(ifa->ifa\u addr->sa\u family==AF\u INET){//检查它是否为IP4 //是有效的IP4地址 tmpAddrPtr=&((结构sockaddr_in*)ifa->ifa_addr)->sin_addr; 字符地址缓冲区[INET_ADDRSTRLEN]; inet_ntop(AF_inet,tmpAddrPtr,addressBuffer,inet_ADDRSTRL

我需要在一个Web服务上找到本地机器的IP地址。在C#中,我有

<如何在C++ Linux中实现?

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

还可以将ioctl与SIOCGIFCONF参数一起使用。有一个例子是我最喜欢的方式:

  • 创建UDP套接字
  • 绑定到通配符
  • 连接到1.2.3.41.1.1.1
  • getsockname

    1.2.3.4是一个不可能的IP地址,所有主机都将其视为outobund。1.1.1.1是CloudFlare的DNS服务器,具有多播路由,因此您的主机无法访问它。(如果他们将1.allocable设置为可分配,则必须使用0.2.3.4,这可能会调用未定义的行为)


    当然,您需要为IPv6更新此选项。

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


    但这里有更多关于BSD套接字的信息。这是一个学习更多知识的好地方

    C++在linux中使用系统调用“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
    
    以下是用户提供的获取所有接口的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;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    int main(int argc,const char*argv[]{
    结构ifaddrs*ifAddrStruct=NULL;
    结构ifaddrs*ifa=NULL;
    void*tmpAddrPtr=NULL;
    getifaddrs(&ifaddstruct);
    对于(ifa=ifAddrStruct;ifa!=NULL;ifa=ifa->ifa\U next){
    如果(ifa->ifa\u addr->sa\u family==AF\u INET){//检查它是否为IP4
    //是有效的IP4地址
    tmpAddrPtr=&((结构sockaddr_in*)ifa->ifa_addr)->sin_addr;
    字符地址缓冲区[INET_ADDRSTRLEN];
    inet_ntop(AF_inet,tmpAddrPtr,addressBuffer,inet_ADDRSTRLEN);
    printf(“%s”:%s\n,ifa->ifa\u名称,addressBuffer);
    }否则,如果(ifa->ifa\u addr->sa\u family==AF\u INET6){//检查它是否为IP6
    //是一个有效的IP6地址
    tmpaddrpr=&((结构sockaddr\u in6*)ifa->ifa\u addr)->sin6\u addr;
    字符地址缓冲区[INET6_ADDRSTRLEN];
    inet_ntop(AF_INET6,tmpAddrPtr,addressBuffer,INET6_ADDRSTRLEN);
    printf(“%s”:%s\n,ifa->ifa\u名称,addressBuffer);
    } 
    }
    if(ifaddstruct!=NULL)
    freeifaddrs(ifaddstruct);//记住要释放ifaddstruct
    返回0;
    }
    
    如果计算机上有多个网卡和多个接口,但只有一个网卡可以连接到公共互联网,该怎么办?从
    #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;
    }