54SA.COM|专注于系统运维管理,为中国SA提供动力!
当前位置: 主页 > Linux > 网络管理 > Linux安全 >

Linux下查询IP归属地的实现

时间:2011-10-23 00:00来源:网络 编辑:lavy

以下是我的实现:使用的时候很简单:

点击(此处)折叠或打开

/**

*1.调用qqwry_init_parser创建一个qqwry_parser_t类型的解析器

*2.初始化一个存放查询结果信息的qqwry_record

*3.调用qqwry_querey_iprecord查询指定ip的归属地

*4.调用qqwry_release_parser释放资源

**/

qqwry_parser_t parser = qqwry_init_parser("/root/QQWry.Dat", VERBOSE_ENABLE,

CACHE_ENABLE, 1);

qqwry_record qr = QQWARY_RECORD_INITIALIZER();

qqwry_querey_iprecord(parser, "61.172.201.195", &qr);

qqwry_release_parser(parser);

这是一个初级版本,还没有经过大量的测试,可能存在很多不完备的地方,希望亲们试用了之后,能够提出改进意见啊。

qqwry_utils.h

点击(此处)折叠或打开

/*

* qqwry_utils.h

*

* Created on: 2012-4-26

* Author: zhanlin

*/

#ifndef QQWRY_UTILS_H_

#define QQWRY_UTILS_H_

int ipaddr_to_bytes(const char *src, char *dest);

void bytes_to_ipaddr(const char *src, char *dest);

inline int32_t char3_to_int32(const char *buf);

#endif /* QQWRY_UTILS_H_ */

qqwry_utils.c

点击(此处)折叠或打开

/*

* qqwry_utils.c

*

* Created on: 2012-4-26

* Author: zhanlin

*/

#include <string.h>

#include <sys/types.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include "qqwry_utils.h"

int ipaddr_to_bytes(const char *src, char *dest) {

int n;

char *newstr;

char *sub;

int i = 0;

n = strlen(src);

newstr = (char *) malloc(n + 1);

if (newstr == NULL) {

return -1;

}

memcpy(newstr, src, n);

*(newstr + n) = 0;

sub = strtok(newstr, ".");

while (sub != NULL) {

// printf("%s atoi %d\n", sub, atoi(sub));

*(dest + i) = (char) atoi(sub);

sub = strtok(NULL, ".");

i++;

}

free(newstr);

return 0;

}

void bytes_to_ipaddr(const char *src, char *dest) {

sprintf(dest, "%c.%c.%c.%c", src[0], src[1], src[2], src[3]);

}

inline int32_t char3_to_int32(const char *buf) {

int32_t i = 0;

memcpy(&i, buf, 3);

return i;

}

qqwry_types.h

点击(此处)折叠或打开

/*

* qqwry_types.h

*

* Created on: 2012-4-26

* Author: zhanlin

*/

#ifndef QQWRY_TYPES_H_

#define QQWRY_TYPES_H_

#include <sys/types.h>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <dirent.h>

#pragma pack(0)

typedef struct _qqwry_header {

u_int32_t qh_idx_start;

u_int32_t qh_idx_end;

} qqwry_header, *qqwry_header_t;

#endif /* QQWRY_TYPES_H_ */

qqwry_parser.h

点击(此处)折叠或打开

/*

* qqwry_parser.h

*

* Created on: 2012-4-26

* Author: zhanlin

*/

#ifndef QQWRY_PARSER_H_

#define QQWRY_PARSER_H_

#include <sys/types.h>

enum {

VERBOSE_DISABLE = 0, VERBOSE_ENABLE = 1

};

enum {

CACHE_DISABLE = 0, CACHE_ENABLE = 1

};

typedef struct _qqwry_record {

char qr_ipaddr[20];

int32_t qr_ip;

char qr_bigzone[1024];

char qr_smallzone[1024];

} qqwry_record, *qqwry_record_t;

#define QQWARY_RECORD_INITIALIZER() {\

.qr_ipaddr = {0}, \

.qr_ip = 0, \

.qr_bigzone = {0}, \

.qr_smallzone = {0}, \

}

struct _qqwry_parser;

typedef struct _qqwry_parser qqwry_parser, *qqwry_parser_t;

qqwry_parser_t qqwry_init_parser(const char *dbpath, int verb, int cache,

int loaddb);

int qqwry_load_db(qqwry_parser_t parser);

void qqwry_unload_db(qqwry_parser_t parser);

int qqwry_querey_iprecord(qqwry_parser_t parser, const char *ipaddr, qqwry_record_t qr);

void qqwry_release_parser(qqwry_parser_t parser);

int load_db_to_mem(qqwry_parser_t parser);

#endif /* QQWRY_PARSER_H_ */

qqwry_types.c

点击(此处)折叠或打开

/*

* qqwry_types.c

*

* Created on: 2012-4-26

* Author: root

*/

#include "qqwry_parser.h"

#include "qqwry_utils.h"

#include "qqwry_types.h"

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <errno.h>

#include <iconv.h>

#include <arpa/inet.h>

[责任编辑:admin]

------分隔线----------------------------