我们已经讨论了反向DNS查找缓存的实现。正向DNS查找正在获取在Web浏览器中键入的给定域名的IP地址。
缓存应执行以下操作:
1.添加从URL到IP地址的映射
2.查找给定URL的IP地址。
我们需要纳入反向DNS查找缓存的一些更改。
1.我们需要注意[AZ],[az]和(。)点而不是[0-9]和(。)点。由于大多数域名仅包含小写字符,我们可以假定每个trie节点将有[az]和(。)27个子代。
2.当我们在浏览器中输入www.google.in和google.in时,将带我们到同一页面。因此,我们需要在Trie中为www(。)之后的单词添加一个域名。同样,在搜索域名对应的IP地址时,如果用户提供了www(。),则将其删除。
这只是一项练习,为简单起见,我们已经使用了www。还。
一种解决方案是使用哈希。在本文中,将讨论基于Trie的解决方案。基于Trie的解决方案的一个优势是,对于Trie,最坏情况的上限是O(1),对于哈希,最好的平均情况下时间复杂度是O(1)。同样,使用Trie,我们可以实现前缀搜索(为URL的公共前缀查找所有IP)。 Trie的一般缺点是需要大量内存。
这个想法是将URL存储在Trie节点中,并将相应的IP地址存储在最后一个节点或叶节点中。
以下是C++中的C样式实现。
// C based program to implement reverse DNS lookup
#include
#include
#include
// There are atmost 27 different chars in a valid URL
// assuming URL consists [a-z] and (.)
#define CHARS 27
// Maximum length of a valid URL
#define MAX 100
// A utility function to find index of child for a given character 'c'
int getIndex(char c)
{
return (c == '.') ? 26 : (c - 'a');
}
// A utility function to find character for a given child index.
char getCharFromIndex(int i)
{
return (i == 26) ? '.' : ('a' + i);
}
// Trie Node.
struct trieNode
{
bool isLeaf;
char *ipAdd;
struct trieNode *child[CHARS];
};
// Function to create a new trie node.
struct trieNode *newTrieNode(void)
{
struct trieNode *newNode = new trieNode;
newNode->isLeaf = false;
newNode->ipAdd = NULL;
for (int i = 0; ichild[i] = NULL;
return newNode;
}
// This method inserts a URL and corresponding IP address
// in the trie. The last node in Trie contains the ip address.
void insert(struct trieNode *root, char *URL, char *ipAdd)
{
// Length of the URL
int len = strlen(URL);
struct trieNode *pCrawl = root;
// Traversing over the length of the URL.
for (int level = 0; levelchild[index])
pCrawl->child[index] = newTrieNode();
// Move to the child
pCrawl = pCrawl->child[index];
}
//Below needs to be carried out for the last node.
//Save the corresponding ip address of the URL in the
//last node of trie.
pCrawl->isLeaf = true;
pCrawl->ipAdd = new char[strlen(ipAdd) + 1];
strcpy(pCrawl->ipAdd, ipAdd);
}
// This function returns IP address if given URL is
// present in DNS cache. Else returns NULL
char *searchDNSCache(struct trieNode *root, char *URL)
{
// Root node of trie.
struct trieNode *pCrawl = root;
int len = strlen(URL);
// Traversal over the length of URL.
for (int level = 0; levelchild[index])
return NULL;
pCrawl = pCrawl->child[index];
}
// If we find the last node for a given ip address,
// print the ip address.
if (pCrawl != NULL && pCrawl->isLeaf)
return pCrawl->ipAdd;
return NULL;
}
// Driver function.
int main()
{
char URL[][50] = { "www.samsung.com", "www.samsung.net",
"www.google.in"
};
char ipAdd[][MAX] = { "107.108.11.123", "107.109.123.255",
"74.125.200.106"
};
int n = sizeof(URL) / sizeof(URL[0]);
struct trieNode *root = newTrieNode();
// Inserts all the domain name and their corresponding
// ip address
for (int i = 0; i %s",
url, res_ip);
else
printf("Forward DNS look up not resolved in cache ");
return 0;
}
输出:
Forward DNS look up resolved in cache:
www.samsung.com --> 107.108.11.123