mirror of
https://github.com/bjdgyc/anylink.git
synced 2025-08-11 02:43:13 +08:00
修改客户端分配的ip为CIDR格式,请注意原来network格式
This commit is contained in:
@@ -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
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
|
@@ -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")
|
||||
|
@@ -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()
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
|
@@ -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()
|
||||
}
|
||||
|
Reference in New Issue
Block a user