这是我参加比赛得到的题目
为了加快查询速度我采取了多线程(最大线程数通过参数控制)的方法,下面是我设计的程序流程(以3个线程为例):
- 开发一个域名批量查询程序,文本文件data.txt中存储着N个域名,每行一个,
- 要求程序从该文件中读取域名数据,然后获取该域名对应的IP地址列表.比如
- 文件内容为:
- www.126.com
- www.132321321.com
- www.baidu.com
- 输出格式为:
- 域名
- IP个数
- IP1
- IP2
- ...
- 例如,上面的例子文件中的输出结果为:
- www.126.com
- 1
- 121.20.3.105
- www.132321321.com
- 0
- www.baidu.com
- 3
- 212.32.4.211
- 10.52.32.32
- 102.31.0.91
下面是我设计保存结果的,由于我用的是多线程,因此用链表保存,这样不会出现线程之间同时修改同一个变量的问题,这样不需要加上锁,只需要把链表指针传入,我设计的链表是一个链表上的各个节点又各自保存另一个链表(保存每个域名的多个ip)
源代码:
- /*
- * 系统环境:Linux kernel 2.6.18 gcc 4.1.2 pthread,dns服务器使用/etc/resolv.conf的配置
- * 编译: gcc test1.c -o test1 -lpthread
- 输入参数:
- 参数1:数据文件路径,必须
- 参数2:线程数,不输入则默认为4,最小值为1
- * 运行: ./test1 datafilename <max thread num> 默认线程数为4
- * 例子: ./test1 d.txt
- * 例子: ./test1 d.txt 3
- * ----------------------------------------------------------------------------------------------------
- * Copyright (c) 2010 by yifangyou
- * All rights reserved
- * ----------------------------------------------------------------------------------------------------
- * 开发一个域名批量查询程序,文本文件data.txt中存储着N个域名,每行一个,
- * 要求程序从该文件中读取域名数据,然后获取该域名对应的IP地址列表.比如
- * 文件内容为:
- * www.126.com
- * www.132321321.com
- * www.baidu.com
- * 输出格式为:
- * 域名
- * IP个数
- * IP1
- * IP2
- * ...
- * 例如,上面的例子文件中的输出结果为:
- *
- * www.126.com
- * 1
- * 121.20.3.105
- * www.132321321.com
- * 0
- * www.baidu.com
- * 3
- * 212.32.4.211
- * 10.52.32.32
- * 102.31.0.91
- *----------------------------------------------------------------------------------------------------
- * 本程序的数据结构是
- * query_list_head
- * ->query_list1---------------------------->query_list2-------------------->query_list3
- * ->domain1 ->domain
- * ip_num1 ip_num
- * host_list_head host_list_head
- * ->ip1->ip2->ip3 ->ip2_1->ip2_2->ip2_3
- */
- #include
/* for printf */- #include
/* for malloc */- #include
tring.h> /*for strlen,strdup */- #include
/* for inet_ntoa */- #include
/* for inet_ntoa */- #include
in.h> /* for inet_ntoa */ - #include
/* for inet_ntoa */- #include
/* for gethostbyname */- #include
/* for pthread_create,pthread_join*/- #include
ddef.h> /*