Chinaunix首页 | 论坛 | 博客
  • 博客访问: 212931
  • 博文数量: 70
  • 博客积分: 2050
  • 博客等级: 大尉
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-15 21:42
文章分类

全部博文(70)

文章存档

2013年(1)

2011年(5)

2010年(3)

2009年(9)

2008年(17)

2007年(6)

2006年(29)

我的朋友

分类: C/C++

2006-07-31 17:11:01

#include 
#include 
#include 
#include 

#define QQWry   "QQWry.Dat"
#define of3(b)  ((unsigned char)(b)[0] | ((unsigned char)(b)[1] << 8) | ((unsigned char)(b)[2] << 16))

int fd;

off_t
read_offset(off_t offset)
{
    char b[4];

    if (pread(fdb3offset) != 3)
    {
        fprintf(stderr"Invalid QQWry.Dat.\n");
        exit(1);
    }

    return of3(b);
}

void
read_country_name(off_t offsetchar *name)
{
    if (offset == 0strcpy(name"unkown");
    else while (pread(fdname1offset++) == 1 && *name++ != '\0');
}

void
read_area_name(off_t offsetchar *name)
{
    pread(fdname1offset);
    (name[0] == 1 || name[0] == 2) && (offset = read_offset(offset + 1));
    read_country_name(offsetname);
}

#define p(n)    (unsigned char)buffer[n]
void
print_ip_dotted_quad(char *buffer)
{
    printf("%d.%d.%d.%d "p(3), p(2), p(1), p(0));
}

void
print_ip_record(off_t offset)
{
    char buffer[32], country[128], area[512];
    off_t off1;

    // pread(fd, buffer, 4, offset); print_ip_dotted_quad(buffer);
    offset += 4;
    pread(fdbuffer1offset);
    switch (buffer[0])
    {
        case 0x01:
            off1 = read_offset(offset + 1);
            pread(fdbuffer1off1);
            if (buffer[0] == 0x02)
            {
                read_country_name(read_offset(off1 + 1), country);
                read_area_name(off1 + 4area);
            }
            else 
            {
                read_country_name(off1country);
                read_area_name(off1 + strlen(country) + 1area);
            }
            break;
        case 0x02:
            read_country_name(read_offset(offset + 1), country);
            read_area_name(offset + 4area);
            break;
        default:
            read_country_name(offsetcountry);
            read_area_name(offset + strlen(country) + 1area);
            break;
    }
    !strcmp(area" CZ88.NET") && (area[0] = '\0');
    printf("%s %s\n"countryarea);
}

int
main(int argcchar *argv[])
{
    unsigned int firstlastoffset;
    in_addr_t find;
    unsigned char buffer[8];

    if (inet_pton(AF_INETargv[1], &find) <= 0)
    {
        struct hostent *h;

        h = gethostbyname(argv[1]);
        if (h == NULL)
        {
            perror(argv[1]);
            return 1;
        }
        memcpy(&findh->h_addrh->h_length);
    }
    find = ntohl(find);

    if ((fd = open(QQWryO_RDONLY)) < 0)
    {
        perror(QQWry);
        return 2;
    }
    pread(fd, &firstsizeof(first), 0);
    pread(fd, &lastsizeof(last), sizeof(first));
    for (offset = firstoffset <= last && pread(fdbuffer7offset) == 7offset += 7)
    {
        if (*(in_addr_t *)buffer > find)
        {
            // print_ip_dotted_quad(buffer);
            pread(fdbuffer7offset - 7);
            print_ip_record((off_t)of3(buffer + 4));
            break;
        }
    }
    if (offset > last)
        printf("Not found.\n");

    close(fd);
    return 0;
}
点击查看《》,下载 
文件: QQWry.zip
大小: 1KB
下载: 下载

阅读(1392) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~