2013年(56)
分类: LINUX
2013-08-30 13:52:01
以下是我的实现:使用的时候很简单:
点击(此处)折叠或打开
/**
*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
#include
#include
#include
#include
#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
#include
#include
#include
#include
#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
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
*/