1 Star 0 Fork 0

王耀辉 / utils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
net.go 2.31 KB
一键复制 编辑 原始数据 按行查看 历史
王耀辉 提交于 2022-08-06 14:46 . Uint32ToIpv4
// Copyright (c) 2022 Yaohui Wang (yaohuiwang@outlook.com)
// utils is licensed under Mulan PubL v2.
// You can use this software according to the terms and conditions of the Mulan PubL v2.
// You may obtain a copy of Mulan PubL v2 at:
// http://license.coscl.org.cn/MulanPubL-2.0
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PubL v2 for more details.
package utils
import (
"bytes"
"fmt"
"net"
"strconv"
"strings"
)
// cidr contai
func IpInNetwork(ipstr string, cidr string) bool {
ip := net.ParseIP(ipstr)
if _, ipnet, err := net.ParseCIDR(cidr); err != nil {
return false
} else {
return ipnet.Contains(ip)
}
}
// allocate ip from cidr
func AllocIPFromCidr(cidr string, exist []string) (*string, error) {
cidrIp, cidrNet, err := net.ParseCIDR(cidr)
if err != nil {
return nil, err
}
for ip := cidrIp.Mask(cidrNet.Mask); cidrNet.Contains(ip); inc(ip) {
ipstr := ip.String()
if !ListContains(exist, ipstr) {
return &ipstr, nil
}
}
return nil, fmt.Errorf("cidr is full")
}
// allocate ip from range
func AllocIPFromRange(start string, end string, exist []string) (*string, error) {
startIp := net.ParseIP(start)
endIp := net.ParseIP(end)
for ip := startIp; bytes.Compare(ip, endIp) < 0; inc(ip) {
ipstr := ip.String()
if !ListContains(exist, ipstr) {
return &ipstr, nil
}
}
return nil, fmt.Errorf("ip range is full")
}
// inc ip
func inc(ip net.IP) {
for j := len(ip) - 1; j >= 0; j-- {
ip[j]++
if ip[j] > 0 {
break
}
}
}
// convert ipv4 to unit32
func Ipv4ToUint32(ipv4 string) (uint32, error) {
var ipv4Uint32 uint32 = 0
words := strings.Split(ipv4, ".")
if len(words) != 4 {
return 0, fmt.Errorf("wrong ipv4 format")
}
for i, word := range words {
digit, err := strconv.ParseUint(word, 10, 32)
if err != nil {
return 0, fmt.Errorf("wrong ipv4 format")
}
ipv4Uint32 += uint32(digit) << ((3 - i) * 8)
}
return ipv4Uint32, nil
}
// convert unit32 to ipv4
func Uint32ToIpv4(ipv4Uint32 uint32) string {
ipv4 := ""
var mask uint32 = 0xff000000
for i := 0; i < 4; i++ {
word := (ipv4Uint32 & mask) >> ((3 - i) * 8)
ipv4 += fmt.Sprintf(".%d", word)
mask >>= 8
}
return ipv4[1:]
}
Go
1
https://gitee.com/yaohuiwang/utils.git
git@gitee.com:yaohuiwang/utils.git
yaohuiwang
utils
utils
v0.2.7

搜索帮助