p2p.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package proxy
  2. import (
  3. "github.com/cnlh/nps/lib/common"
  4. "github.com/cnlh/nps/lib/conn"
  5. "github.com/cnlh/nps/vender/github.com/astaxie/beego/logs"
  6. "github.com/cnlh/nps/vender/github.com/xtaci/kcp"
  7. "strconv"
  8. "time"
  9. )
  10. type P2PServer struct {
  11. BaseServer
  12. p2pPort int
  13. p2p map[string]*p2p
  14. }
  15. type p2p struct {
  16. provider *conn.Conn
  17. visitor *conn.Conn
  18. visitorAddr string
  19. providerAddr string
  20. }
  21. func NewP2PServer(p2pPort int) *P2PServer {
  22. return &P2PServer{
  23. p2pPort: p2pPort,
  24. p2p: make(map[string]*p2p),
  25. }
  26. }
  27. func (s *P2PServer) Start() error {
  28. kcpListener, err := kcp.ListenWithOptions(":"+strconv.Itoa(s.p2pPort), nil, 150, 3)
  29. if err != nil {
  30. logs.Error(err)
  31. return err
  32. }
  33. for {
  34. c, err := kcpListener.AcceptKCP()
  35. conn.SetUdpSession(c)
  36. if err != nil {
  37. logs.Warn(err)
  38. continue
  39. }
  40. go s.p2pProcess(conn.NewConn(c))
  41. }
  42. return nil
  43. }
  44. func (s *P2PServer) p2pProcess(c *conn.Conn) {
  45. //获取密钥
  46. var (
  47. f string
  48. b []byte
  49. err error
  50. v *p2p
  51. ok bool
  52. )
  53. if b, err = c.GetShortContent(32); err != nil {
  54. return
  55. }
  56. //获取角色
  57. if f, err = c.ReadFlag(); err != nil {
  58. return
  59. }
  60. if v, ok = s.p2p[string(b)]; !ok {
  61. v = new(p2p)
  62. s.p2p[string(b)] = v
  63. }
  64. //存储
  65. if f == common.WORK_P2P_VISITOR {
  66. v.visitorAddr = c.Conn.RemoteAddr().String()
  67. v.visitor = c
  68. for {
  69. time.Sleep(time.Second)
  70. if v.provider != nil {
  71. break
  72. }
  73. }
  74. if _, err := v.provider.ReadFlag(); err == nil {
  75. v.visitor.WriteLenContent([]byte(v.providerAddr))
  76. delete(s.p2p, string(b))
  77. } else {
  78. }
  79. } else {
  80. v.providerAddr = c.Conn.RemoteAddr().String()
  81. v.provider = c
  82. for {
  83. time.Sleep(time.Second)
  84. if v.visitor != nil {
  85. v.provider.WriteLenContent([]byte(v.visitorAddr))
  86. break
  87. }
  88. }
  89. }
  90. }