diff --git a/server/sessdata/ip_pool.go b/server/sessdata/ip_pool.go index b749dc9..a2f3d2a 100644 --- a/server/sessdata/ip_pool.go +++ b/server/sessdata/ip_pool.go @@ -58,7 +58,7 @@ func ip2long(ip net.IP) uint32 { return binary.BigEndian.Uint32(ip) } -// 获取动态ip +// AcquireIp 获取动态ip func AcquireIp(username, macAddr string) net.IP { IpPool.mux.Lock() defer IpPool.mux.Unlock() @@ -71,37 +71,24 @@ func AcquireIp(username, macAddr string) net.IP { if err == nil { ip := mi.IpAddr ipStr := ip.String() + // 跳过活跃连接 + _, ok := ipActive[ipStr] // 检测原有ip是否在新的ip池内 - if IpPool.Ipv4IPNet.Contains(ip) { + if IpPool.Ipv4IPNet.Contains(ip) && !ok { mi.Username = username mi.LastLogin = tNow // 回写db数据 _ = dbdata.Save(mi) ipActive[ipStr] = true return ip - } else { - _ = dbdata.Del(mi) } - } - // 全局遍历未分配ip - // 优先获取没有使用的ip - for i := IpPool.IpLongMin; i <= IpPool.IpLongMax; i++ { - ip := long2ip(i) - ipStr := ip.String() - mi := &dbdata.IpMap{} - err := dbdata.One("IpAddr", ip, mi) - if err != nil && dbdata.CheckErrNotFound(err) { - // 该ip没有被使用 - mi := &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow} - _ = dbdata.Save(mi) - ipActive[ipStr] = true - return ip - } + _ = dbdata.Del(mi) + } farIp := &dbdata.IpMap{LastLogin: tNow} - // 遍历超过租期ip + // 全局遍历超过租期ip for i := IpPool.IpLongMin; i <= IpPool.IpLongMax; i++ { ip := long2ip(i) ipStr := ip.String() @@ -112,11 +99,20 @@ func AcquireIp(username, macAddr string) net.IP { } v := &dbdata.IpMap{} - err := dbdata.One("IpAddr", ip, v) + err = dbdata.One("IpAddr", ip, v) if err != nil { + if dbdata.CheckErrNotFound(err) { + // 该ip没有被使用 + mi = &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow} + _ = dbdata.Save(mi) + ipActive[ipStr] = true + return ip + } base.Error(err) return nil } + + // 跳过ip保留 if v.Keep { continue } @@ -124,7 +120,7 @@ func AcquireIp(username, macAddr string) net.IP { // 已经超过租期 if tNow.Sub(v.LastLogin) > time.Duration(base.Cfg.IpLease)*time.Second { _ = dbdata.Del(v) - mi := &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow} + mi = &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow} // 重写db数据 _ = dbdata.Save(mi) ipActive[ipStr] = true diff --git a/web/package-lock.json b/web/package-lock.json index 5e57c24..6c37e41 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -3419,10 +3419,14 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001135", - "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001135.tgz?cache=0&sync_timestamp=1600754676334&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001135.tgz", - "integrity": "sha1-mVseuUQEo8mg12AMETybsn8s2Ko=", - "dev": true + "version": "1.0.30001240", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz", + "integrity": "sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.3.0", @@ -17187,9 +17191,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001135", - "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001135.tgz?cache=0&sync_timestamp=1600754676334&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001135.tgz", - "integrity": "sha1-mVseuUQEo8mg12AMETybsn8s2Ko=", + "version": "1.0.30001240", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz", + "integrity": "sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==", "dev": true }, "case-sensitive-paths-webpack-plugin": {