blockchainIDsystem/peer/connections.go
peer/connections.goRaw
1package main
2
3import (
4 "bufio"
5 "fmt"
6 "log"
7 "net"
8
9 "github.com/fatih/color"
10)
11
12func acceptPeers(peer Peer) {
13 fmt.Println("accepting peers at: " + peer.Port)
14 l, err := net.Listen("tcp", peer.IP+":"+peer.Port)
15 if err != nil {
16 log.Println("Error accepting peers. Listening port: " + peer.Port)
17 running = false
18 }
19 for running {
20 conn, err := l.Accept()
21 if err != nil {
22 log.Println("Error accepting peers. Error accepting connection")
23 running = false
24 }
25 var newPeer Peer
26 newPeer.IP = getIPFromConn(conn)
27 newPeer.Port = getPortFromConn(conn)
28 newPeer.Conn = conn
29 incomingPeersList = appendPeerIfNoExist(incomingPeersList, newPeer)
30 go handleConn(conn, newPeer)
31 }
32}
33func connectToPeer(peer Peer) {
34 color.Green("connecting to new peer")
35 log.Println("Connecting to new peer: " + peer.IP + ":" + peer.Port)
36 conn, err := net.Dial("tcp", peer.IP+":"+peer.Port)
37 if err != nil {
38 log.Println("Error connecting to: " + peer.IP + ":" + peer.Port)
39 return
40 }
41 peer.Conn = conn
42 outcomingPeersList = appendPeerIfNoExist(outcomingPeersList, peer)
43 go handleConn(conn, peer)
44}
45func handleConn(conn net.Conn, connPeer Peer) {
46 connRunning := true
47 log.Println("handling conn: " + conn.RemoteAddr().String())
48 //reply to the conn, send the peerList
49 var msg Msg
50 msg.construct("PeersList", "here my outcomingPeersList")
51 msg.PeersList = outcomingPeersList
52 msgB := msg.toBytes()
53 _, err := conn.Write(msgB)
54 check(err)
55
56 for connRunning {
57 /*
58 buffer := make([]byte, 1024)
59 bytesRead, err := conn.Read(buffer)
60 */
61 newmsg, err := bufio.NewReader(conn).ReadString('\n')
62 if err != nil {
63 log.Println(err)
64 connRunning = false
65 } else {
66 var msg Msg
67 //msg = msg.createFromBytes([]byte(string(buffer[0:bytesRead])))
68 msg = msg.createFromBytes([]byte(newmsg))
69 messageHandler(connPeer, msg)
70 }
71 }
72 //TODO add that if the peer closed is the p2p server, show a warning message at the peer
73 log.Println("Peer: " + conn.RemoteAddr().String() + " connection closed")
74 conn.Close()
75 //TODO delete the peer from the outcomingPeersList --> DONE
76 deletePeerFromPeersList(connPeer, &outcomingPeersList)
77 color.Yellow("peer deleted, current peerList:")
78 printPeersList()
79}