`
steven-zhou
  • 浏览: 212438 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

基于二叉树实现路由匹配算法

阅读更多
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

struct node {
	struct node *left;
	struct node *right;
	char *gateway;
};

void buildtree(struct node *root, char *rule);
void ruleSplit(char *rule, int *dest, int *masklen, char *gw);
int ipparser(const char *dststr);
void route(struct node *root, const char *to, char *dst);

int main(int argc, char **argv)
{

	char rule1[] = "192.168.5.0/24 192.168.5.254";
	char rule2[] = "10.131.0.0/16 10.131.0.254";
	char rule3[] = "16.0.0.0/8 16.0.0.254";

	printf("------------ route table ------------\n");
	printf("%s\n", rule1);
	printf("%s\n", rule2);
	printf("%s\n", rule3);
	printf("0.0.0.0/0 192.168.102.253\n");
	printf("-------------------------------------\n");

	char *defaultroute = "192.168.102.253";

	struct node *root = (struct node *)malloc(sizeof(struct node));
	if (NULL != root) {
		root->left = NULL;
		root->right = NULL;
		root->gateway = defaultroute;
	}
	buildtree(root, rule1);
	buildtree(root, rule2);
	buildtree(root, rule3);

	char to1[16] = "192.168.5.20";
	char gw[16] = "";
	route(root, to1, gw);
	printf("%s --> %s\n", to1, gw);

	char to2[16] = "192.168.102.40";
	route(root, to2, gw);
	printf("%s --> %s\n", to2, gw);

	char to3[16] = "10.238.20.11";
	route(root, to3, gw);
	printf("%s --> %s\n", to3, gw);

	char to4[16] = "16.0.0.169";
	route(root, to4, gw);
	printf("%s --> %s\n", to4, gw);

	exit(EXIT_SUCCESS);
}

void buildtree(struct node *root, char *rule)
{
	int netip, masklen;
	char *gw = (char *)malloc(16);
	ruleSplit(rule, &netip, &masklen, gw);

	struct node *p = root;
	int i = 0;
	for (i = 31; i >= 0 && masklen > 0; i--, masklen--) {
		if (netip & (1 << i)) {
			// 1: -->
			if (NULL == p->right) {
				struct node *newNode =
				    (struct node *)malloc(sizeof(struct node));
				p->right = newNode;
			}
			p = p->right;
		} else {
			// 0: <--
			if (NULL == p->left) {
				struct node *newNode =
				    (struct node *)malloc(sizeof(struct node));
				p->left = newNode;
			}
			p = p->left;
		}
	}
	p->gateway = gw;
}

void ruleSplit(char *rule, int *dest, int *masklen, char *gw)
{
	char *p = strchr(rule, '/');
	char ip[16];
	strncpy(ip, rule, p - rule + 1);
	ip[p - rule] = '\0';
	*dest = ipparser(ip);

	char *q = strchr(rule, ' ');
	char len[3];
	strncpy(len, p + 1, q - p);
	len[q - p] = '\0';
	*masklen = atoi(len);

	strcpy(gw, q + 1);
}

void route(struct node *root, const char *to, char *dst)
{
	char *gw = root->gateway;
	struct node *p = root;
	int netip = ipparser(to);
	int i;
	for (i = 31; i >= 0; i--) {
		int k = 1 << i;
		if (k < 0)
			k = 0 - k;
		if (netip & k) {	// 指定位为1, 向右走
			if (NULL == p->right) {
				break;
			} else {
				p = p->right;
				if (p->gateway != NULL) {
					gw = p->gateway;
				}
			}
		} else {	// 指定位为0, 向左走
			if (NULL == p->left) {
				break;
			} else {
				p = p->left;
				if (p->gateway != NULL) {
					gw = p->gateway;
				}
			}
		}
	}
	strcpy(dst, gw);
}

int ipparser(const char *dststr)
{
	char str[strlen(dststr)];
	strcpy(str, dststr);
	char *token = strtok(str, ".");
	int ip = 0;
	while (NULL != token) {
		ip <<= 8;
		ip += atoi(token);
		token = strtok(NULL, ".");
	}
	return ip;
}


// 运行结果
steven@lenny:~/study/c$ ./a.out 
------------ route table ------------
192.168.5.0/24 192.168.5.254
10.131.0.0/16 10.131.0.254
16.0.0.0/8 16.0.0.254
0.0.0.0/0 192.168.102.253
-------------------------------------
192.168.5.20 --> 192.168.5.254
192.168.102.40 --> 192.168.102.253
10.238.20.11 --> 192.168.102.253
16.0.0.169 --> 16.0.0.254
steven@lenny:~/study/c$ 
分享到:
评论

相关推荐

    论文研究-基于物理位置的结构化P2P路由改进算法 .pdf

    总结来说,基于物理位置的结构化P2P路由改进算法的研究,关键在于如何优化Chord算法以及其模型结构,以适应物理网络的实际结构,实现逻辑网络与物理网络的更好匹配,从而有效降低路由延迟,提高P2P网络的资源搜索...

    Java和C语言实现各种经典算法

    6. 字符串处理:KMP算法、Rabin-Karp算法和Boyer-Moore算法等,这些都是字符串匹配的经典算法,广泛应用于文本处理和搜索引擎中。 7. 回溯法和分支限界法:常用于解决组合优化问题,如八皇后问题和旅行商问题。 8....

    一种基于ABV的IPV6快速路由查找算法 (2006年)

    ### 一种基于ABV的IPV6快速路由查找算法 #### 概述 本文献《一种基于ABV的IPV6快速路由查找算法》由党小超、李焱及李学军三位作者于2006年发表。该研究旨在探讨IPv6路由查找技术,并提出了一种基于聚合位向量...

    Go-GoLang实现的各种算法用于学习目的

    4. **图算法**:如深度优先搜索(DFS)、广度优先搜索(BFS)、Dijkstra算法、Floyd算法等,这些算法在解决复杂网络问题,如路由计算、社交网络分析等方面有很大应用。 5. **树算法**:如二叉搜索树操作、树的遍历...

    数据结构算法(ACM比赛必备算法)

    图论算法在路由算法、社交网络分析、旅行商问题等方面发挥着重要作用,如Dijkstra算法、Floyd-Warshall算法和Kruskal算法。 8. **线性表**:线性表是最基础的数据结构之一,包括数组和链表等形式。数组适用于随机...

    AlgorithmGossip 常用算法C/java实现

    3. 图算法:如Dijkstra最短路径算法、Floyd-Warshall算法和Prim最小生成树算法,用于处理图结构的数据,常见于网络路由、社交网络分析等领域。 4. 动态规划:如背包问题、最长公共子序列、斐波那契数列等。动态规划...

    常用算法及其Python实现

    6. **字符串处理**:字符串匹配算法如KMP算法和Boyer-Moore算法,用于高效地在文本中查找子串。此外,模式匹配和文本处理也是算法的重要应用场景。 7. **数据结构**:包括链表、栈、队列、堆、树(二叉树、平衡树如...

    路由原理与技术路由查询PPT学习教案.pptx

    路由查询算法可以按照数据结构和实现方式,以及查询依据进行分类。常见的算法包括基于检索树(Trie)查找、基于硬件TCAM查找、分段查找、哈希表查找以及Cache命中查找。这些算法各有优劣,评价标准主要关注查找速度...

    cpp-算法导论第三版中算法的C实现

    5. **字符串处理**:如KMP算法、Rabin-Karp算法,用于模式匹配;Manacher's Algorithm用于找出字符串中的最长回文子串。 6. **递归与分治**:如快速幂运算(Quick Power)、分治策略在解决复杂问题时的运用,如...

    经典算法大全(C语言实现):老奔整理

    3. **图论算法**:如Dijkstra最短路径算法、Floyd-Warshall所有对最短路径算法、Prim最小生成树算法等,这些算法在网络路由、物流规划等领域有广泛应用。 4. **动态规划**:如背包问题、最长公共子序列、斐波那契...

    数据与算法课件:6 树与二叉树.pdf

    二叉树的应用广泛,包括在编译器设计中解析语法树、在操作系统中管理文件系统,以及在网络路由算法中构建路由表。二叉树的遍历是学习二叉树的重要部分,通常包括前序遍历(根-左-右)、中序遍历(左-根-右)和后序...

    C语言经典算法大全(非常全的算法 C语言实现)

    7. **数据结构**:链表、栈、队列、树(如二叉树、平衡树AVL和红黑树)、图等基本数据结构的实现和操作,是理解和应用算法的基础。 8. **数学算法**:如大整数运算、素数检测、快速幂等,这些在加密算法、数值计算...

    62种常见算法(JAVA,C实现都有)

    字符串匹配算法,如KMP、Boyer-Moore和Rabin-Karp,用于文本处理和搜索引擎。 数据结构也是算法的重要组成部分,如栈、队列、链表、树(二叉树、AVL树、红黑树)、哈希表和图,它们为算法提供了存储和操作数据的...

    算法讲义 算法讲义算法讲义

    12. **字符串匹配算法**:如KMP算法、Boyer-Moore算法,用于高效地在文本中查找子串。 13. **概率算法**:运用概率论解决计算问题,如蒙特卡洛方法、拉斯维加斯算法。 14. **近似算法**:在无法找到精确解时,寻找...

    java算法大全,有近100多种常见算法的源代码

    此外,还包括字符串匹配算法,如KMP算法、Boyer-Moore算法等,它们在文本处理和信息检索等领域发挥着重要作用。还有一些数据结构相关的算法,如栈、队列、链表、树(二叉树、AVL树、红黑树等)的操作和遍历。 这个...

    第四章_路由设计基础

    IP路由选择遵循最长前缀匹配原则,即在路由表中查找与目的IP地址前缀最长的匹配项,以确定最佳路径。为了加速查找,路由表通常采用层次化结构,如二叉树或压缩方法。 在Internet中,路由选择分为自治系统内的域内...

    十个重要的C语言算法实现

    在IT行业中,C语言是一种基础且强大的...在实际工作中,这些算法的应用场景广泛,如搜索引擎的索引构建、游戏的AI设计、网络路由算法等。通过深入学习和实践这些算法,IT专业人士可以更好地理解和解决各种技术挑战。

    JavaScript实现的计算机科学算法.zip

    这些算法用于对数组进行有序排列,JavaScript中的Array.sort()方法就是基于某种排序算法实现的。 2. **搜索算法**:二分查找、线性查找等,用于在数据集合中寻找特定元素。二分查找适用于已排序的数组,效率远高于...

    常用算法程序集-徐士良-常用算法程序集-徐士良

    9. 字符串匹配算法:如KMP算法、Boyer-Moore算法、Rabin-Karp算法,用于在文本中快速查找特定字符串。 10. 编程竞赛算法:如ACM/ICPC中的常见问题,如区间调度、贪心策略、模拟等,这些都是提升编程能力的有效训练...

Global site tag (gtag.js) - Google Analytics