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 = msg.construct("PeersList", "here my outcomingPeersList", outcomingPeersList)
61	msgB := msg.toBytes()
62	_, err := conn.Write(msgB)
63	check(err)
64
65	for connRunning {
66		/*
67			buffer := make([]byte, 1024)
68			bytesRead, err := conn.Read(buffer)
69		*/
70		newmsg, err := bufio.NewReader(conn).ReadString('\n')
71		if err != nil {
72			log.Println(err)
73			connRunning = false
74		} else {
75			/*
76				fmt.Println(buffer)
77				fmt.Println(bytesRead)
78			*/
79			var msg Msg
80			//color.Blue(string(buffer[0:bytesRead]))
81			//msg = msg.createFromBytes([]byte(string(buffer[0:bytesRead])))
82			msg = msg.createFromBytes([]byte(newmsg))
83			messageHandler(connPeer, msg)
84		}
85	}
86	//TODO add that if the peer closed is the p2p server, show a warning message at the peer
87	log.Println("Peer: " + conn.RemoteAddr().String() + " connection closed")
88	conn.Close()
89	//TODO delete the peer from the outcomingPeersList
90}