保险Linux

Linux下查询IP归属地的实现

以下是我的实现:使用的时候很简单:  点击(此处)折叠或打开  /**  *1.调用qqwry_init_parser创建一个qqwry_parser_t类型的解析器  *2.初始化一个存放查询结果信息的qqwry_record  *3.调用qqwry_querey_iprecord查询指定ip的归属地  *4.调用qqwry_release_parse...显示全部
以下是我的实现:使用的时候很简单:
  点击(此处)折叠或打开
  /**
  *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 %dn", 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
  */收起
参与4

查看其它 2 个回答xpxp117的回答

xpxp117xpxp117系统管理员甘肃兰州
看看!!!!!
电信设备制造商 · 2013-06-17
浏览1304

回答者

xpxp117
系统管理员甘肃兰州

回答状态

  • 发布时间:2013-06-17
  • 关注会员:1 人
  • 回答浏览:1304
  • X社区推广