更改dtlssession的存储方式

This commit is contained in:
bjdgyc 2021-05-26 19:13:09 +08:00
parent c744983cbc
commit f342b12372
1 changed files with 31 additions and 21 deletions

View File

@ -50,12 +50,12 @@ type ConnSession struct {
PayloadOutCstp chan *Payload // Cstp的数据 PayloadOutCstp chan *Payload // Cstp的数据
PayloadOutDtls chan *Payload // Dtls的数据 PayloadOutDtls chan *Payload // Dtls的数据
mux sync.RWMutex // dSess *DtlsSession
dSess *DtlsSession // Dtls Session dSess *atomic.Value
// DSess *atomic.Value
} }
type DtlsSession struct { type DtlsSession struct {
isActive int32
CSess *ConnSession CSess *ConnSession
CloseChan chan struct{} CloseChan chan struct{}
closeOnce sync.Once closeOnce sync.Once
@ -169,6 +169,14 @@ func (s *Session) NewConn() *ConnSession {
return nil return nil
} }
// 查询group信息
group := &dbdata.Group{}
err = dbdata.One("Name", s.Group, group)
if err != nil {
base.Error(err)
return nil
}
cSess := &ConnSession{ cSess := &ConnSession{
Sess: s, Sess: s,
MacHw: macHw, MacHw: macHw,
@ -178,16 +186,17 @@ func (s *Session) NewConn() *ConnSession {
PayloadIn: make(chan *Payload), PayloadIn: make(chan *Payload),
PayloadOutCstp: make(chan *Payload), PayloadOutCstp: make(chan *Payload),
PayloadOutDtls: make(chan *Payload), PayloadOutDtls: make(chan *Payload),
dSess: &atomic.Value{},
} }
// 查询group信息 dSess := &DtlsSession{
group := &dbdata.Group{} isActive: -1,
err = dbdata.One("Name", s.Group, group) CSess: cSess,
if err != nil { CloseChan: make(chan struct{}),
base.Error(err) closeOnce: sync.Once{},
cSess.Close()
return nil
} }
cSess.dSess.Store(dSess)
cSess.Group = group cSess.Group = group
if group.Bandwidth > 0 { if group.Bandwidth > 0 {
// 限流设置 // 限流设置
@ -222,20 +231,20 @@ func (cs *ConnSession) Close() {
// 创建dtls链接 // 创建dtls链接
func (cs *ConnSession) NewDtlsConn() *DtlsSession { func (cs *ConnSession) NewDtlsConn() *DtlsSession {
cs.mux.Lock() ds := cs.dSess.Load().(*DtlsSession)
defer cs.mux.Unlock() isActive := atomic.LoadInt32(&ds.isActive)
if isActive > 0 {
if cs.dSess != nil {
// 判断原有连接存在,不进行创建 // 判断原有连接存在,不进行创建
return nil return nil
} }
dSess := &DtlsSession{ dSess := &DtlsSession{
isActive: 1,
CSess: cs, CSess: cs,
CloseChan: make(chan struct{}), CloseChan: make(chan struct{}),
closeOnce: sync.Once{}, closeOnce: sync.Once{},
} }
cs.dSess = dSess cs.dSess.Store(dSess)
return dSess return dSess
} }
@ -243,18 +252,19 @@ func (cs *ConnSession) NewDtlsConn() *DtlsSession {
func (ds *DtlsSession) Close() { func (ds *DtlsSession) Close() {
ds.closeOnce.Do(func() { ds.closeOnce.Do(func() {
base.Info("closeOnce dtls:", ds.CSess.IpAddr) base.Info("closeOnce dtls:", ds.CSess.IpAddr)
ds.CSess.mux.Lock()
defer ds.CSess.mux.Unlock()
atomic.StoreInt32(&ds.isActive, -1)
close(ds.CloseChan) close(ds.CloseChan)
ds.CSess.dSess = nil
}) })
} }
func (cs *ConnSession) GetDtlsSession() *DtlsSession { func (cs *ConnSession) GetDtlsSession() *DtlsSession {
cs.mux.RLock() ds := cs.dSess.Load().(*DtlsSession)
defer cs.mux.RUnlock() isActive := atomic.LoadInt32(&ds.isActive)
return cs.dSess if isActive > 0 {
return ds
}
return nil
} }
const BandwidthPeriodSec = 2 // 流量速率统计周期(秒) const BandwidthPeriodSec = 2 // 流量速率统计周期(秒)