You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.2 KiB

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