ubuntu(Linux) c++ 獲取本機IPv4和ipv6、查詢本機IPv4,IPv6


1.關於

演示環境:

Linux xxxxxxx 5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

代碼來自 StackOverflow But,自己做了部分修改。

2.頭文件

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

3.ipv4獲取

調用函數get_ip_linux可以獲取本機ipv4

int net_adapter_helper::get_ipv4_linux(std::list<std::string>& out_list_ip4)
{
    return get_ip_linux(AF_INET, out_list_ip4); 
}

4.ipv6獲取

調用函數get_ip_linux可以獲取本機ipv6

int net_adapter_helper::get_ipv6_linux(std::list<std::string>& out_list_ip6)
{
    return get_ip_linux(AF_INET6, out_list_ip6); 
}

5.get_ip_linux封裝

這里封裝,目的是為了更方便維護獲取本機IP的代碼。通過第一個參數控制當前需要獲取ipv4還是ipv6

int net_adapter_helper::get_ip_linux(int ipv4_6, std::list<std::string>& out_list_ip)
{
    int ret_val = 0;

    struct ifaddrs * ifAddrStruct 	= NULL;
    void * tmpAddrPtr 				= NULL;

    // 1.
    ret_val 						= getifaddrs(&ifAddrStruct);
    if (0 != ret_val)
    {
        ret_val = errno;

        return ret_val;
    }

    // 2.
    std::string str_ipvX;

    int padress_buf_len = 0;
    char addressBuffer[INET6_ADDRSTRLEN] = {0};

    if (AF_INET6 == ipv4_6)
            padress_buf_len = INET6_ADDRSTRLEN;
    else
        padress_buf_len = INET_ADDRSTRLEN;
    
    
    while (NULL != ifAddrStruct ) 
    {
        if (ipv4_6 == ifAddrStruct->ifa_addr->sa_family ) 
        { 
            // is a valid IP4 Address
            tmpAddrPtr = &((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
            
            inet_ntop(ipv4_6, tmpAddrPtr, addressBuffer, padress_buf_len);
            str_ipvX = std::string(addressBuffer);

            out_list_ip.push_back(str_ipvX);

            memset(addressBuffer, 0, padress_buf_len);
        } 

        ifAddrStruct=ifAddrStruct->ifa_next;
    }

    return ret_val;
}

6.測試結果

  • 6.1 調用代碼
std::list<std::string> ipv4;
std::list<std::string> ipv6;

int ret_val = net_adapter_helper::get().get_ipv4_linux(ipv4);
if (0 != ret_val)
{
    cout << "error, ipv4, id = " << ret_val << endl;
}
else
{
    int index = 0;
    for (auto item: ipv4)
    {
        cout << "index = " << ++index;
        cout << ", ipv4 = " << item.c_str() << endl;
    }
}


ret_val = net_adapter_helper::get().get_ipv6_linux(ipv6);
if (0 != ret_val)
{
    cout << "error, ipv6, id = " << ret_val << endl;
}
else
{
    int index = 0;
    for (auto item: ipv6)
    {
        cout << "index = " << ++index;
        cout << ", ipv6 = " << item.c_str() << endl;
    }
}
  • 6.2 輸出結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM