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