implemented peersList propagation, each peer connects with each other
arnaucode arnaucode@gmail.com
Fri, 24 Nov 2017 18:11:55 +0100
5 files changed,
68 insertions(+),
26 deletions(-)
M
peer/config.json
→
peer/config.json
@@ -1,8 +1,8 @@
{ "ip": "127.0.0.1", - "port": "3007", + "port": "3001", "restip": "127.0.0.1", - "restport": "3008", + "restport": "3002", "serverip": "127.0.0.1", "serverport": "3000" }
M
peer/connections.go
→
peer/connections.go
@@ -5,6 +5,8 @@ "bufio"
"fmt" "log" "net" + + "github.com/fatih/color" ) func acceptPeers(peer Peer) {@@ -32,18 +34,22 @@ color.Red("-----")
fmt.Println(resp) //newPeer.ID = resp */ - peersList.Peers = append(peersList.Peers, newPeer) + //incomingPeersList.Peers = append(incomingPeersList.Peers, newPeer) + incomingPeersList = appendPeerIfNoExist(incomingPeersList, newPeer) go handleConn(conn, newPeer) } } func connectToPeer(peer Peer) { + color.Green("connecting to new peer") + log.Println("Connecting to new peer: " + peer.IP + ":" + peer.Port) conn, err := net.Dial("tcp", peer.IP+":"+peer.Port) if err != nil { log.Println("Error connecting to: " + peer.IP + ":" + peer.Port) return } peer.Conn = conn - peersList.Peers = append(peersList.Peers, peer) + //outcomingPeersList.Peers = append(outcomingPeersList.Peers, peer) + outcomingPeersList = appendPeerIfNoExist(outcomingPeersList, peer) go handleConn(conn, peer) } func handleConn(conn net.Conn, connPeer Peer) {@@ -51,7 +57,7 @@ connRunning := true
log.Println("handling conn: " + conn.RemoteAddr().String()) //reply to the conn, send the peerList var msg Msg - msg = msg.construct("PeersList", "here my peersList", peersList) + msg = msg.construct("PeersList", "here my outcomingPeersList", outcomingPeersList) msgB := msg.toBytes() _, err := conn.Write(msgB) check(err)@@ -80,5 +86,5 @@ }
//TODO add that if the peer closed is the p2p server, show a warning message at the peer log.Println("Peer: " + conn.RemoteAddr().String() + " connection closed") conn.Close() - //TODO delete the peer from the peersList + //TODO delete the peer from the outcomingPeersList }
M
peer/main.go
→
peer/main.go
@@ -49,19 +49,22 @@ runningPeer.ID = "0"
} } thisPeerID = runningPeer.ID - peersList.PeerID = runningPeer.ID + outcomingPeersList.PeerID = runningPeer.ID fmt.Println(runningPeer) - peersList.Peers = append(peersList.Peers, runningPeer) - fmt.Println(peersList) + //outcomingPeersList.Peers = append(outcomingPeersList.Peers, runningPeer) + outcomingPeersList = appendPeerIfNoExist(outcomingPeersList, runningPeer) + fmt.Println(outcomingPeersList) if runningPeer.Role == "server" { go acceptPeers(runningPeer) } if runningPeer.Role == "client" { var newPeer Peer + newPeer.ID = "0" newPeer.IP = config.ServerIP newPeer.Port = config.ServerPort newPeer.Role = "server" connectToPeer(newPeer) + go acceptPeers(runningPeer) } for running {
M
peer/messages.go
→
peer/messages.go
@@ -31,7 +31,7 @@ color.Blue("newPeerslist")
fmt.Println(msg.PeersList) //time.Sleep(1000 * time.Millisecond) - updatePeersList(peer.Conn, msg.PeersList) + updateNetworkPeersList(peer.Conn, msg.PeersList) propagatePeersList(peer) printPeersList() break@@ -40,7 +40,7 @@ color.Blue("newPeerslist")
fmt.Println(msg.PeersList) //time.Sleep(1000 * time.Millisecond) - updatePeersList(peer.Conn, msg.PeersList) + updateNetworkPeersList(peer.Conn, msg.PeersList) printPeersList() break case "MyID":
M
peer/peersList.go
→
peer/peersList.go
@@ -14,8 +14,17 @@ Peers []Peer `json:"peerslist"`
Date time.Time `json:"date"` } -//var peersList []Peer -var peersList PeersList +var outcomingPeersList PeersList +var incomingPeersList PeersList +var networkPeersList PeersList //the peers that have been received in the lists from other peers + +/* +a future option is to put: + type PeersList struct { + Incoming PeersList + Outcoming PeersList + } +*/ func peerIsInPeersList(p Peer, pl []Peer) int { r := -1@@ -26,23 +35,30 @@ }
} return r } -func updatePeersList(conn net.Conn, newPeersList PeersList) { +func appendPeerIfNoExist(pl PeersList, p Peer) PeersList { + i := peerIsInPeersList(p, pl.Peers) + if i == -1 { + pl.Peers = append(pl.Peers, p) + } + return pl +} +func updateNetworkPeersList(conn net.Conn, newPeersList PeersList) { for _, peer := range newPeersList.Peers { if getIPPortFromConn(conn) == peer.IP+":"+peer.Port { peer.ID = newPeersList.PeerID color.Yellow(peer.ID) } - i := peerIsInPeersList(peer, peersList.Peers) + i := peerIsInPeersList(peer, networkPeersList.Peers) if i == -1 { - peersList.Peers = append(peersList.Peers, peer) + networkPeersList.Peers = append(networkPeersList.Peers, peer) } else { - fmt.Println(peersList.Peers[i]) - peersList.Peers[i].ID = peer.ID + fmt.Println(networkPeersList.Peers[i]) + networkPeersList.Peers[i].ID = peer.ID } } } func searchPeerAndUpdate(p Peer) { - for _, peer := range peersList.Peers { + for _, peer := range outcomingPeersList.Peers { color.Red(p.IP + ":" + p.Port) color.Yellow(peer.IP + ":" + peer.Port) if p.IP+":"+p.Port == peer.IP+":"+peer.Port {@@ -51,14 +67,14 @@ }
} } -//send the peersList to all the peers except the peer that has send the peersList +//send the outcomingPeersList to all the peers except the peer that has send the outcomingPeersList func propagatePeersList(p Peer) { - for _, peer := range peersList.Peers { + for _, peer := range networkPeersList.Peers { if peer.Conn != nil { if peer.ID != p.ID && p.ID != "" { color.Yellow(peer.ID + " - " + p.ID) var msg Msg - msg = msg.construct("PeersList", "here my peersList", peersList) + msg = msg.construct("PeersList", "here my outcomingPeersList", outcomingPeersList) msgB := msg.toBytes() _, err := peer.Conn.Write(msgB) check(err)@@ -73,19 +89,36 @@ _, err := p.Conn.Write(msgB)
check(err) */ var msg Msg - msg = msg.construct("PeersList_Response", "here my peersList", peersList) + msg = msg.construct("PeersList_Response", "here my outcomingPeersList", outcomingPeersList) msgB := msg.toBytes() _, err := peer.Conn.Write(msgB) check(err) } + } else { + //connect to peer + if peer.ID != p.ID && peer.ID != runningPeer.ID { + if peerIsInPeersList(peer, outcomingPeersList.Peers) == -1 { + connectToPeer(peer) + } + } + } } } func printPeersList() { fmt.Println("") - color.Green("PEERSLIST:") - color.Green("runningPeer.ID: " + runningPeer.ID) - for _, peer := range peersList.Peers { + color.Blue("runningPeer.ID: " + runningPeer.ID) + color.Green("OUTCOMING PEERSLIST:") + for _, peer := range outcomingPeersList.Peers { + fmt.Println(peer) + } + color.Green("INCOMING PEERSLIST:") + for _, peer := range incomingPeersList.Peers { + fmt.Println(peer) + } + + color.Green("NETWORK PEERSLIST:") + for _, peer := range networkPeersList.Peers { fmt.Println(peer) } fmt.Println("")