smartdns.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. #include "fast_ping.h"
  2. #include "hashtable.h"
  3. #include "list.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void smartdns_ping_result(const char *host, FAST_PING_RESULT result, int seqno, struct timeval *tv, void *userptr)
  7. {
  8. if (result == PING_RESULT_RESPONSE) {
  9. double rtt = tv->tv_sec * 1000.0 + tv->tv_usec / 1000.0;
  10. printf("%16s: seq=%d time=%.3f\n", host, seqno, rtt);
  11. } else if (result == PING_RESULT_TIMEOUT) {
  12. printf("%16s: seq=%d timeout\n", host, seqno);
  13. }
  14. }
  15. int smartdns_init()
  16. {
  17. int ret;
  18. ret = fast_ping_init();
  19. if (ret != 0) {
  20. fprintf(stderr, "start ping failed.\n");
  21. goto errout;
  22. }
  23. fast_ping_result_callback(smartdns_ping_result);
  24. ret = dns_client_init();
  25. if (ret != 0) {
  26. fprintf(stderr, "start dns client failed.\n");
  27. goto errout;
  28. }
  29. return 0;
  30. errout:
  31. return -1;
  32. }
  33. int smartdns_run()
  34. {
  35. fast_ping_start("192.168.1.1", 2000, 0);
  36. fast_ping_start("192.168.1.35", 2000, 0);
  37. fast_ping_start("14.215.177.38", 2000, 0);
  38. fast_ping_start("113.96.161.87", 2000, 0);
  39. fast_ping_start("::1", 2000, 0);
  40. fast_ping_start("12.4.3.1", 1000, 0);
  41. while (1) {
  42. sleep(10);
  43. //fast_ping_stop("192.168.1.35");
  44. }
  45. }
  46. void smartdns_exit()
  47. {
  48. fast_ping_exit();
  49. dns_client_exit();
  50. }
  51. struct data {
  52. struct list_head list;
  53. int n;
  54. };
  55. void list_test()
  56. {
  57. struct list_head head;
  58. struct list_head *iter;
  59. int i = 0;
  60. INIT_LIST_HEAD(&head);
  61. for (i = 0; i < 10; i++) {
  62. struct data *h = malloc(sizeof(struct data));
  63. h->n = i;
  64. list_add(&h->list, &head);
  65. }
  66. list_for_each(iter, &head)
  67. {
  68. struct data *d = list_entry(iter, struct data, list);
  69. printf("%d\n", d->n);
  70. }
  71. }
  72. struct data_hash {
  73. struct hlist_node node;
  74. int n;
  75. char str[32];
  76. };
  77. int hash_test()
  78. {
  79. DEFINE_HASHTABLE(ht, 7);
  80. struct data_hash *temp;
  81. struct data_hash *obj;
  82. int i;
  83. int key;
  84. for (i = 11; i < 17; i++) {
  85. temp = malloc(sizeof(struct data_hash));
  86. temp->n = i * i;
  87. hash_add(ht, &temp->node, temp->n);
  88. }
  89. for (i = 11; i < 17; i++) {
  90. key = i * i;
  91. hash_for_each_possible(ht, obj, node, key)
  92. {
  93. printf("value: %d\n", obj->n);
  94. };
  95. }
  96. return 0;
  97. }
  98. int hash_string_test()
  99. {
  100. DEFINE_HASHTABLE(ht, 7);
  101. struct data_hash *temp;
  102. struct data_hash *obj;
  103. int i;
  104. int key;
  105. for (i = 0; i < 10; i++) {
  106. temp = malloc(sizeof(struct data_hash));
  107. sprintf(temp->str, "%d", i);
  108. hash_add(ht, &temp->node, hash_string(temp->str));
  109. }
  110. for (i = 0; i < 10; i++) {
  111. char key_str[32];
  112. sprintf(key_str, "%d", i);
  113. key = hash_string(key_str);
  114. hash_for_each_possible(ht, obj, node, key)
  115. {
  116. printf("i = %d value: %s\n", i, obj->str);
  117. };
  118. }
  119. return 0;
  120. }
  121. #if 0
  122. struct data_rbtree {
  123. struct rb_node list;
  124. int value;
  125. };
  126. int rbtree_test()
  127. {
  128. struct rb_root root;
  129. struct rb_node *n;
  130. RB_EMPTY_ROOT(&root);
  131. int i;
  132. for (i = 0; i < 10; i++)
  133. {
  134. struct data_rbtree *r = malloc(sizeof(struct data_rbtree));
  135. r->value = i;
  136. rb_insert(&r->list, &root);
  137. }
  138. n = rb_first(&root);
  139. int num = 5;
  140. while (n) {
  141. struct data_rbtree *r = container_of(n, struct data_rbtree, list);
  142. if (r->value < num) {
  143. n = n->rb_left;
  144. } else if (r->value > num) {
  145. n = n->rb_right;
  146. } else {
  147. printf("n = %d\n", r->value);
  148. break;
  149. }
  150. }
  151. return 0;
  152. }
  153. #endif
  154. int main(int argc, char *argv[])
  155. {
  156. int ret;
  157. atexit(smartdns_exit);
  158. ret = smartdns_init();
  159. if (ret != 0) {
  160. fprintf(stderr, "init smartdns failed.\n");
  161. goto errout;
  162. }
  163. return smartdns_run();
  164. errout:
  165. return 1;
  166. }