nps/server/proxy/p2p.go

81 lines
1.6 KiB
Go
Raw Normal View History

2019-02-26 14:40:28 +00:00
package proxy
import (
"github.com/cnlh/nps/lib/common"
2019-04-21 15:03:58 +00:00
"github.com/cnlh/nps/lib/pool"
2019-08-10 03:10:01 +00:00
"github.com/astaxie/beego/logs"
2019-03-23 14:19:59 +00:00
"net"
2019-04-21 15:03:58 +00:00
"strings"
2019-02-26 14:40:28 +00:00
"time"
)
type P2PServer struct {
BaseServer
2019-04-21 15:03:58 +00:00
p2pPort int
p2p map[string]*p2p
listener *net.UDPConn
2019-02-26 14:40:28 +00:00
}
type p2p struct {
2019-04-21 15:03:58 +00:00
visitorAddr *net.UDPAddr
providerAddr *net.UDPAddr
2019-02-26 14:40:28 +00:00
}
func NewP2PServer(p2pPort int) *P2PServer {
return &P2PServer{
p2pPort: p2pPort,
p2p: make(map[string]*p2p),
}
}
func (s *P2PServer) Start() error {
2019-04-21 15:03:58 +00:00
logs.Info("start p2p server port", s.p2pPort)
var err error
s.listener, err = net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), s.p2pPort, ""})
if err != nil {
return err
}
for {
buf := pool.BufPoolUdp.Get().([]byte)
n, addr, err := s.listener.ReadFromUDP(buf)
if err != nil {
if strings.Contains(err.Error(), "use of closed network connection") {
break
}
continue
}
go s.handleP2P(addr, string(buf[:n]))
}
return nil
2019-02-26 14:40:28 +00:00
}
2019-04-21 15:03:58 +00:00
func (s *P2PServer) handleP2P(addr *net.UDPAddr, str string) {
2019-02-26 14:40:28 +00:00
var (
2019-04-21 15:03:58 +00:00
v *p2p
ok bool
2019-02-26 14:40:28 +00:00
)
2019-04-21 15:03:58 +00:00
arr := strings.Split(str, common.CONN_DATA_SEQ)
if len(arr) < 2 {
2019-02-26 14:40:28 +00:00
return
}
2019-04-21 15:03:58 +00:00
if v, ok = s.p2p[arr[0]]; !ok {
2019-02-26 14:40:28 +00:00
v = new(p2p)
2019-04-21 15:03:58 +00:00
s.p2p[arr[0]] = v
2019-02-26 14:40:28 +00:00
}
2019-04-21 15:03:58 +00:00
logs.Trace("new p2p connection ,role %s , password %s ,local address %s", arr[1], arr[0], addr.String())
if arr[1] == common.WORK_P2P_VISITOR {
v.visitorAddr = addr
2019-04-08 09:01:08 +00:00
for i := 20; i > 0; i-- {
2019-04-21 15:03:58 +00:00
if v.providerAddr != nil {
s.listener.WriteTo([]byte(v.providerAddr.String()), v.visitorAddr)
s.listener.WriteTo([]byte(v.visitorAddr.String()), v.providerAddr)
2019-02-26 14:40:28 +00:00
break
}
2019-04-08 09:01:08 +00:00
time.Sleep(time.Second)
2019-02-26 14:40:28 +00:00
}
2019-04-21 15:03:58 +00:00
delete(s.p2p, arr[0])
2019-02-26 14:40:28 +00:00
} else {
2019-04-21 15:03:58 +00:00
v.providerAddr = addr
2019-02-26 14:40:28 +00:00
}
}