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()
|
|
|
|
}
|