修改客户端分配的ip为CIDR格式,请注意原来network格式

This commit is contained in:
bjd
2021-02-04 13:32:10 +08:00
parent 1c6572f5e3
commit edb0fe2dc9
32 changed files with 155 additions and 139 deletions

View File

@@ -45,8 +45,6 @@ func CopyStruct(a interface{}, b interface{}, fields ...string) (err error) {
// a中有同名的字段并且类型一致才复制
if f.IsValid() && f.Kind() == bValue.Kind() {
f.Set(bValue)
} else {
// fmt.Printf("no such field or different kind, fieldName: %s\n", name)
}
}
return

View File

@@ -19,7 +19,8 @@ type ipPoolConfig struct {
mux sync.Mutex
// 计算动态ip
Ipv4Gateway net.IP
Ipv4IPNet net.IPNet
Ipv4Mask net.IP
Ipv4IPNet *net.IPNet
IpLongMin uint32
IpLongMax uint32
}
@@ -27,11 +28,12 @@ type ipPoolConfig struct {
func initIpPool() {
// 地址处理
// ip地址
ip := net.ParseIP(base.Cfg.Ipv4Network)
// 子网掩码
maskIp := net.ParseIP(base.Cfg.Ipv4Netmask).To4()
IpPool.Ipv4IPNet = net.IPNet{IP: ip, Mask: net.IPMask(maskIp)}
_, ipNet, err := net.ParseCIDR(base.Cfg.Ipv4CIDR)
if err != nil {
panic(err)
}
IpPool.Ipv4IPNet = ipNet
IpPool.Ipv4Mask = net.IP(ipNet.Mask)
IpPool.Ipv4Gateway = net.ParseIP(base.Cfg.Ipv4Gateway)
// 网络地址零值
@@ -74,11 +76,11 @@ func AcquireIp(username, macAddr string) net.IP {
mi.Username = username
mi.LastLogin = tNow
// 回写db数据
dbdata.Save(mi)
_ = dbdata.Save(mi)
ipActive[ipStr] = true
return ip
} else {
dbdata.Del(mi)
_ = dbdata.Del(mi)
}
}
@@ -92,7 +94,7 @@ func AcquireIp(username, macAddr string) net.IP {
if err != nil && dbdata.CheckErrNotFound(err) {
// 该ip没有被使用
mi := &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow}
dbdata.Save(mi)
_ = dbdata.Save(mi)
ipActive[ipStr] = true
return ip
}
@@ -121,10 +123,10 @@ func AcquireIp(username, macAddr string) net.IP {
// 已经超过租期
if tNow.Sub(v.LastLogin) > time.Duration(base.Cfg.IpLease)*time.Second {
dbdata.Del(v)
_ = dbdata.Del(v)
mi := &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow}
// 重写db数据
dbdata.Save(mi)
_ = dbdata.Save(mi)
ipActive[ipStr] = true
return ip
}
@@ -145,7 +147,7 @@ func AcquireIp(username, macAddr string) net.IP {
ipStr := ip.String()
mi = &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow}
// 回写db数据
dbdata.Save(mi)
_ = dbdata.Save(mi)
ipActive[ipStr] = true
return ip
}
@@ -160,6 +162,6 @@ func ReleaseIp(ip net.IP, macAddr string) {
err := dbdata.One("IpAddr", ip, mi)
if err == nil {
mi.LastLogin = time.Now()
dbdata.Save(mi)
_ = dbdata.Save(mi)
}
}

View File

@@ -15,8 +15,7 @@ import (
func preData(tmpDir string) {
tmpDb := path.Join(tmpDir, "test.db")
base.Cfg.DbFile = tmpDb
base.Cfg.Ipv4Network = "192.168.3.0"
base.Cfg.Ipv4Netmask = "255.255.255.0"
base.Cfg.Ipv4CIDR = "192.168.3.0/24"
base.Cfg.Ipv4Pool = []string{"192.168.3.1", "192.168.3.199"}
base.Cfg.MaxClient = 100
base.Cfg.MaxUserClient = 3
@@ -26,12 +25,12 @@ func preData(tmpDir string) {
Name: "group1",
Bandwidth: 1000,
}
dbdata.Save(&group)
_ = dbdata.Save(&group)
initIpPool()
}
func cleardata(tmpDir string) {
dbdata.Stop()
_ = dbdata.Stop()
tmpDb := path.Join(tmpDir, "test.db")
os.Remove(tmpDb)
}
@@ -45,15 +44,15 @@ func TestIpPool(t *testing.T) {
var ip net.IP
for i := 1; i <= 100; i++ {
ip = AcquireIp("user", fmt.Sprintf("mac-%d", i))
_ = AcquireIp("user", fmt.Sprintf("mac-%d", i))
}
ip = AcquireIp("user", fmt.Sprintf("mac-new"))
ip = AcquireIp("user", "mac-new")
assert.True(net.IPv4(192, 168, 3, 101).Equal(ip))
for i := 102; i <= 199; i++ {
ip = AcquireIp("user", fmt.Sprintf("mac-%d", i))
}
assert.True(net.IPv4(192, 168, 3, 199).Equal(ip))
ip = AcquireIp("user", fmt.Sprintf("mac-nil"))
ip = AcquireIp("user", "mac-nil")
assert.Nil(ip)
ReleaseIp(net.IPv4(192, 168, 3, 88), "mac-88")

View File

@@ -43,10 +43,11 @@ func TestLimitClient(t *testing.T) {
func TestLimitWait(t *testing.T) {
assert := assert.New(t)
limit := NewLimitRater(1, 2)
limit.Wait(2)
start := time.Now()
err := limit.Wait(2)
assert.Nil(err)
start := time.Now()
err = limit.Wait(2)
assert.Nil(err)
err = limit.Wait(1)
assert.Nil(err)
end := time.Now()

View File

@@ -34,10 +34,7 @@ func (o Onlines) Len() int {
}
func (o Onlines) Less(i, j int) bool {
if bytes.Compare(o[i].Ip, o[j].Ip) < 0 {
return true
}
return false
return bytes.Compare(o[i].Ip, o[j].Ip) < 0
}
func (o Onlines) Swap(i, j int) {

View File

@@ -78,13 +78,13 @@ func checkSession() {
return
}
timeout := time.Duration(base.Cfg.SessionTimeout) * time.Second
tick := time.Tick(time.Second * 60)
for range tick {
tick := time.NewTicker(time.Second * 60)
for range tick.C {
sessMux.Lock()
t := time.Now()
for k, v := range sessions {
v.mux.Lock()
if v.IsActive != true {
if !v.IsActive {
if t.Sub(v.LastLogin) > timeout {
delete(sessions, k)
}
@@ -133,12 +133,12 @@ func (s *Session) NewConn() *ConnSession {
macAddr := s.MacAddr
username := s.Username
s.mux.Unlock()
if active == true {
if active {
s.CSess.Close()
}
limit := LimitClient(username, false)
if limit == false {
if !limit {
return nil
}
// 获取客户端mac地址
@@ -208,8 +208,10 @@ func (cs *ConnSession) Close() {
const BandwidthPeriodSec = 2 // 流量速率统计周期(秒)
func (cs *ConnSession) ratePeriod() {
tick := time.Tick(time.Second * BandwidthPeriodSec)
for range tick {
tick := time.NewTicker(time.Second * BandwidthPeriodSec)
defer tick.Stop()
for range tick.C {
select {
case <-cs.CloseChan:
return

View File

@@ -28,9 +28,11 @@ func TestConnSession(t *testing.T) {
cSess := sess.NewConn()
cSess.RateLimit(100, true)
err := cSess.RateLimit(100, true)
assert.Nil(err)
assert.Equal(cSess.BandwidthUp, uint32(100))
cSess.RateLimit(200, false)
err = cSess.RateLimit(200, false)
assert.Nil(err)
assert.Equal(cSess.BandwidthDown, uint32(200))
cSess.Close()
}