메모 : IP2LocationLITE의 IP 주소에서 국가 이름 가져오기

4128 단어 cpp
IP 주소에서 지리적 위치 정보를 얻는 방법에는 여러 가지가 있습니다.

이 문서에서는 IP2Location LITE의 무료 데이터를 사용하여 ip에서 국가 이름을 가져오는 방법을 설명합니다.

IP2Location LITE에서 CSV 형식 IP 목록 가져오기



IP2LocationLITE는 국가 및 IP 쌍 데이터를 제공합니다.

여기로 오세요.
https://lite.ip2location.com/database/ip-country

C++에서 코드 작성


  • cvs 형식인 IP2LocationLITE 의 데이터를 읽습니다.
  • ip에서 국가명을 검색합니다.

  • #include <iostream>
    #include <fstream>
    #include <iterator>
    #include <sstream>
    #include <vector>
    
    //
    // data format ref https://lite.ip2location.com/database/ip-country
    // "0","281470681743359","-","-"
    // "281470681743360","281470698520575","-","-"
    // "281470698520576","281470698520831","US","United States of America"
    //  
    //
    void printUsage()
    {
        std::cerr << "./a.out <file path> <ip>" << std::endl;
    }
    
    struct IpAndCountryInfo
    {
        long begin;
        long end;
        std::string country_name;
        IpAndCountryInfo(std::string line)
        {
            std::stringstream ss;
            ss << line;
            std::string begin_src;
            std::string end_src;
    
            std::getline(ss, begin_src, ',');
            std::getline(ss, end_src, ',');
            std::getline(ss, country_name, ',');
    
            if (begin_src.length() > 0 && begin_src[0] == '"')
            {
                begin = std::stol(begin_src.substr(1, begin_src.length() - 2));
            }
            else
            {
                begin = std::stol(begin_src);
            }
    
            if (end_src.length() > 0 && end_src[0] == '"')
            {
                end = std::stol(end_src.substr(1, end_src.length() - 2));
            }
            else
            {
                end = std::stol(end_src);
            }
        }
    
        static IpAndCountryInfo find(std::vector<IpAndCountryInfo> ips, long ip)
        {
            int min = 0;
            int max = ips.size() - 1;
    
            if (ips[min].begin <= ip && ip <= ips[min].end)
            {
                return ips[min];
            }
            if (ips[max].begin <= ip && ip <= ips[max].end)
            {
                return ips[max];
            }
            int index = -1;
            int prev_index = -1;
            do
            {
                prev_index = index;
                index = (max - min) / 2 + min;
                IpAndCountryInfo i = ips[index];
                if (i.begin <= ip && ip <= i.end)
                {
                    return i;
                }
                if (ip < i.begin)
                {
                    max = index;
                }
                else if (i.end < ip)
                {
                    min = index;
                }
                //std::cout << "::" << index<< "::"  << std::endl;
            } while (prev_index != index);
    
            //for(ipinfo i : ips) {
            //    if(i.begin <= ip && ip<=i.end) {
            //        return i;
            //    }
            //}
            throw std::invalid_argument("ipinfo::find");
        }
    
        static void createIpAndCountryInfoList(std::string filepath, std::vector<IpAndCountryInfo> &output)
        {
            std::fstream f(filepath);
            std::string l;
    
            while (std::getline(f, l))
            {
                output.push_back(IpAndCountryInfo(l));
            }
        }
    };
    
    int main(int argc, char *argv[])
    {
        if (argc != 2)
        {
            printUsage();
        }
    
        std::vector<IpAndCountryInfo> context;
        IpAndCountryInfo::createIpAndCountryInfoList(std::string(argv[1]), context);
    
        std::cout << IpAndCountryInfo::find(context, 16781311).country_name << std::endl;
    
        return 0;
    }
    
    


    소스 코드



    https://github.com/kyorohiro/hello_libtorrent
    app/main_get_contryname_from_ip_at_ip2location_data.cpp

    좋은 웹페이지 즐겨찾기