1.根据IP获取用户地理位置思路:
通过IP地址去查询数据库,然后从数据库里面提取相应地理位置信息
2.下载MaxMind的数据库下载地址
https://dev.maxmind.com/geoip/geoip2/geolite2/
它有 binary格式 和 CSV格式的,可以先都下载:
GeoLite2-City.mmdb.gz
GeoLite2-Country.mmdb.gz
GeoLite2-City-CSV_20180306.zip
GeoLite2-Country-CSV_20180306.zip
3.然后是操作它数据库的libmaxminddb的github地址:
https://github.com/maxmind/libmaxminddb/releases
libmaxminddb安装命令:
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig
libmaxminddb说明文档地址:
http://maxmind.github.io/libmaxminddb/
而且还给出一个例子:
#include <errno.h>
#include <maxminddb.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
char *filename = argv[1];
char *ip_address = argv[2];
MMDB_s mmdb;
int status = MMDB_open(filename, MMDB_MODE_MMAP, &mmdb);
if (MMDB_SUCCESS != status) {
fprintf(stderr, "\n Can't open %s - %s\n",
filename, MMDB_strerror(status));
if (MMDB_IO_ERROR == status) {
fprintf(stderr, " IO error: %s\n", strerror(errno));
}
exit(1);
}
int gai_error, mmdb_error;
MMDB_lookup_result_s result =
MMDB_lookup_string(&mmdb, ip_address, &gai_error, &mmdb_error);
if (0 != gai_error) {
fprintf(stderr,
"\n Error from getaddrinfo for %s - %s\n\n",
ip_address, gai_strerror(gai_error));
exit(2);
}
if (MMDB_SUCCESS != mmdb_error) {
fprintf(stderr,
"\n Got an error from libmaxminddb: %s\n\n",
MMDB_strerror(mmdb_error));
exit(3);
}
MMDB_entry_data_list_s *entry_data_list = NULL;
int exit_code = 0;
if (result.found_entry) {
int status = MMDB_get_entry_data_list(&result.entry,
&entry_data_list);
if<