func (p *Router) getDirectSession(id utils.NodeID) *session { if id.Match(p.id) { return nil } p.sessionMutex.RLock() if s, ok := p.sessions[id]; ok { p.sessionMutex.RUnlock() return s } p.sessionMutex.RUnlock() var info *utils.NodeInfo p.dhtMutex.RLock() info = p.mainDht.GetNodeInfo(id) if info == nil { for _, d := range p.groupDht { info = d.GetNodeInfo(id) if info != nil { break } } } p.dhtMutex.RUnlock() if info == nil { return nil } addr, err := utp.ResolveAddr("utp", info.Addr.String()) if err != nil { p.logger.Error("%v", err) return nil } conn, err := utp.DialUTPTimeout("utp", nil, addr, 100*time.Millisecond) if err != nil { p.logger.Error("%v %v", addr, err) return nil } s, err := newSesion(conn, p.key) if err != nil { conn.Close() p.logger.Error("%v", err) return nil } else { go p.readSession(s) p.addSession(s) } return s }