메모 : IP2LocationLITE의 IP 주소에서 국가 이름 가져오기
4128 단어 cpp
이 문서에서는 IP2Location LITE의 무료 데이터를 사용하여 ip에서 국가 이름을 가져오는 방법을 설명합니다.
IP2Location LITE에서 CSV 형식 IP 목록 가져오기
IP2LocationLITE는 국가 및 IP 쌍 데이터를 제공합니다.
여기로 오세요.
https://lite.ip2location.com/database/ip-country
C++에서 코드 작성
#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
Reference
이 문제에 관하여(메모 : IP2LocationLITE의 IP 주소에서 국가 이름 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/kyorohiro/memo-get-country-name-from-ip-address-at-ip2locationlite-2172
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(메모 : IP2LocationLITE의 IP 주소에서 국가 이름 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kyorohiro/memo-get-country-name-from-ip-address-at-ip2locationlite-2172텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)