go实现路由表操作
来源:互联网 发布:ubuntu游客创建新用户 编辑:程序博客网 时间:2024/06/06 17:46
//源代码package comroutingimport ( "fmt" "strconv" "strings")type CRoute_S struct { routeTable map[int]map[int]bool}func CreateCRouter() *CRoute_S { var route CRoute_S route.routeTable = make(map[int]map[int]bool) var maskLen int = 0 for maskLen = 0; maskLen <= 32; maskLen++ { route.routeTable[maskLen] = make(map[int]bool) } return &route}func AddCRouteItem(cr *CRoute_S, prefix string, maskLen int) bool { if nil == cr || nil == cr.routeTable { return false } rtVal := ipStr2Val(prefix) if 0 > rtVal { return false } if maskLen < 0 { maskLen = 0 } else if maskLen > 32 { maskLen = 32 } rtVal = ipValMasked(rtVal, maskLen) cr.routeTable[maskLen][rtVal] = true return true}func DelCRouteItem(cr *CRoute_S, prefix string, maskLen int) bool { if nil == cr || nil == cr.routeTable { return false } rtVal := ipStr2Val(prefix) if 0 > rtVal { return false } if maskLen < 0 { maskLen = 0 } else if maskLen > 32 { maskLen = 32 } rtVal = ipValMasked(rtVal, maskLen) if _, bExist := cr.routeTable[maskLen][rtVal]; false == bExist { return true } delete(cr.routeTable[maskLen], rtVal) return true}func SearchCRoute(cr *CRoute_S, ip string) bool { if nil == cr || nil == cr.routeTable { return false } rtVal := ipStr2Val(ip) if 0 > rtVal { return false } var maskLen int = 0 for maskLen = 32; maskLen >= 0; maskLen-- { tmpVal := ipValMasked(rtVal, maskLen) if _, bExist := cr.routeTable[maskLen][tmpVal]; bExist { fmt.Printf("SearchCRoute ip=%s match Item %s\n", ip, ipVal2Str(tmpVal)) return true } } fmt.Printf("SearchCRoute ip=%s match Item fail\n", ip) return false}func PrintCRoute(cr *CRoute_S) { if nil == cr || nil == cr.routeTable { return } var maskLen int = 0 for maskLen = 32; maskLen >= 0; maskLen-- { if 0 == len(cr.routeTable[maskLen]) { continue } fmt.Printf("maskLen=%d List As:\n", maskLen) itemSeq := 1 for ipVal, _ := range cr.routeTable[maskLen] { fmt.Printf("%d: %s\n", itemSeq, ipVal2Str(ipVal)) itemSeq++ } }}func ipStr2Val(ip string) int { segs := strings.Split(strings.TrimSpace(ip), ".") if 4 != len(segs) { return -1 } ret := make([]int, 0) for _, segx := range segs { val, err := strconv.Atoi(segx) if nil != err { return -1 } ret = append(ret, val) } rtVal := ret[0]<<24 + ret[1]<<16 + ret[2]<<8 + ret[3] return rtVal}func ipVal2Str(ipVal int) string { s1 := (ipVal & 0xff000000) >> 24 s2 := (ipVal & 0xff0000) >> 16 s3 := (ipVal & 0xff00) >> 8 s4 := (ipVal & 0xff) return fmt.Sprintf("%d.%d.%d.%d", s1, s2, s3, s4)}func ipValMasked(ipVal int, maskLen int) int { rtVal := (ipVal >> uint(32-maskLen)) & 0xffffffff rtVal = rtVal << uint(32-maskLen) return rtVal}
//测试代码package mainimport ( "common/comrouting" "fmt")func main() { router := comrouting.CreateCRouter() comrouting.AddCRouteItem(router, "192.168.0.0", 16) comrouting.AddCRouteItem(router, "192.168.1.0", 24) comrouting.PrintCRoute(router) ret := comrouting.SearchCRoute(router, "192.168.1.0") fmt.Printf("ret=%v\n\n", ret) comrouting.DelCRouteItem(router, "192.168.1.0", 24) comrouting.PrintCRoute(router) ret = comrouting.SearchCRoute(router, "192.168.1.0") fmt.Printf("ret=%v\n", ret)}
0 0
- go实现路由表操作
- android 操作路由表
- android 操作路由表
- android 操作路由表
- windows路由表操作
- android路由表操作
- go笔记[2]--路由
- 操作Android手机路由表
- 操作Android手机路由表
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- Linux路由表实现(1)
- Linux路由表实现(2)
- Go操作mysql实现增删改查及连接池
- 为RecylerView添加item点击事件
- Yii2.0 中 jQuery、CSS的引入 [ 2.0 版本 ]
- HTTP与HTTPS的区别
- src和href的区别
- java注解详解
- go实现路由表操作
- 安装MySql出现Access denied for user
- 【Python爬虫5】提取JS动态网页数据
- yii2.0 rbac权限学习笔记 [ 2.0 版本 ]
- xampp 80 端口被占用解决方法
- jQuery如何设置下拉框显示与隐藏
- android app 社交动态
- leetcode[494]:Target Sum
- 【Python爬虫6】表单交互