arnaucube
arnaucube/blockchainIDsystemPublic Self-hosted repository
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		/*
30			//ask to the peer, for the peer ID
31			resp, err := http.Get("http://" + newPeer.IP + ":" + newPeer.Port)
32			check(err)
33			color.Red("-----")
34			fmt.Println(resp)
35			//newPeer.ID = resp
36		*/
37		//incomingPeersList.Peers = append(incomingPeersList.Peers, newPeer)
38		incomingPeersList = appendPeerIfNoExist(incomingPeersList, newPeer)
39		go handleConn(conn, newPeer)
40	}
41}
42func connectToPeer(peer Peer) {
43	color.Green("connecting to new peer")
44	log.Println("Connecting to new peer: " + peer.IP + ":" + peer.Port)
45	conn, err := net.Dial("tcp", peer.IP+":"+peer.Port)
46	if err != nil {
47		log.Println("Error connecting to: " + peer.IP + ":" + peer.Port)
48		return
49	}
50	peer.Conn = conn
51	//outcomingPeersList.Peers = append(outcomingPeersList.Peers, peer)
52	outcomingPeersList = appendPeerIfNoExist(outcomingPeersList, peer)
53	go handleConn(conn, peer)
54}
55func handleConn(conn net.Conn, connPeer Peer) {
56	connRunning := true
57	log.Println("handling conn: " + conn.RemoteAddr().String())
58	//reply to the conn, send the peerList
59	var msg Msg
60	msg.construct("PeersList", "here my outcomingPeersList")
61	msg.PeersList = outcomingPeersList
62	msgB := msg.toBytes()
63	_, err := conn.Write(msgB)
64	check(err)
65
66	for connRunning {
67		/*
68			buffer := make([]byte, 1024)
69			bytesRead, err := conn.Read(buffer)
70		*/
71		newmsg, err := bufio.NewReader(conn).ReadString('\n')
72		if err != nil {
73			log.Println(err)
74			connRunning = false
75		} else {
76			/*
77				fmt.Println(buffer)
78				fmt.Println(bytesRead)
79			*/
80			var msg Msg
81			//color.Blue(string(buffer[0:bytesRead]))
82			//msg = msg.createFromBytes([]byte(string(buffer[0:bytesRead])))
83			msg = msg.createFromBytes([]byte(newmsg))
84			messageHandler(connPeer, msg)
85		}
86	}
87	//TODO add that if the peer closed is the p2p server, show a warning message at the peer
88	log.Println("Peer: " + conn.RemoteAddr().String() + " connection closed")
89	conn.Close()
90	//TODO delete the peer from the outcomingPeersList
91	deletePeerFromPeersList(connPeer, &outcomingPeersList)
92	color.Yellow("peer deleted, current peerList:")
93	printPeersList()
94}