package p2p import "net" import "time" import "sync/atomic" import log "github.com/sirupsen/logrus" import "github.com/deroproject/derosuite/globals" import "github.com/deroproject/derosuite/blockchain" var chain *blockchain.Blockchain // external reference to chain var Exit_Event = make(chan bool) // causes all threads to exit var Exit_In_Progress bool // marks we are doing exit var logger *log.Entry // global logger, every logger in this package is a child of this // Initialize P2P subsystem func P2P_Init(params map[string]interface{}) error { logger = globals.Logger.WithFields(log.Fields{"com": "P2P"}) // all components must use this logger chain = params["chain"].(*blockchain.Blockchain) go P2P_engine() // start outgoing engine //go P2P_Server_v1() // start accepting connections logger.Infof("P2P started") atomic.AddUint32(&globals.Subsystem_Active, 1) // increment subsystem return nil } func P2P_engine() { for { if Exit_In_Progress { return } //remote_addr := "localhost:18090" //remote_addr := "192.168.56.1:18090" //remote_addr := "76.74.170.128:18090" remote_addr := "89.38.97.110:18090" remote_ip, err := net.ResolveTCPAddr("tcp", remote_addr) if err != nil { if Exit_In_Progress { return } logger.Debugf("Resolve address failed:", err.Error()) time.Sleep(2 * time.Second) continue } // since we may be connecting through socks, grab the remote ip for our purpose rightnow conn, err := globals.Dialer.Dial("tcp", remote_ip.String()) if err != nil { if Exit_In_Progress { return } logger.Debugf("Dial failed err %s", err.Error()) time.Sleep(2 * time.Second) continue } logger.Debugf("Connection established to %s", remote_ip) Handle_Connection(conn, remote_ip, false) // handle connection time.Sleep(4 * time.Second) } } // shutdown the p2p component func P2P_Shutdown() { Exit_In_Progress = true close(Exit_Event) // send signal to all connections to exit // TODO we must wait for connections to kill themselves time.Sleep(1 * time.Second) logger.Infof("P2P Shutdown") atomic.AddUint32(&globals.Subsystem_Active, ^uint32(0)) // this decrement 1 fom subsystem } func Connection_ShutDown(connection *Connection) { connection.Conn.Close() }