arnaucube
arnaucube/blockchainIDsystemPublic Self-hosted repository
blockchainIDsystem/peer/connections.go
peer/connections.goRaw
 1package main
 2
 3import (
 4	"encoding/json"
 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		listPeers = append(listPeers, newPeer)
30		go handleConn(conn)
31	}
32}
33func connectToPeer(peer Peer) {
34	conn, err := net.Dial("tcp", peer.IP+":"+peer.Port)
35	if err != nil {
36		log.Println("Error connecting to: " + peer.IP + ":" + peer.Port)
37		return
38	}
39	peer.Conn = conn
40	listPeers = append(listPeers, peer)
41	go handleConn(conn)
42}
43func handleConn(conn net.Conn) {
44	connRunning := true
45	log.Println("handling conn: " + conn.RemoteAddr().String())
46	//reply to the conn
47	msgB := newMsgBytes("Hi", "New Peer connected")
48	_, err := conn.Write(msgB)
49	if err != nil {
50		check(err)
51	}
52
53	buffer := make([]byte, 1024)
54	for connRunning {
55		bytesRead, err := conn.Read(buffer)
56		if err != nil {
57			log.Println(err)
58			connRunning = false
59		} else {
60			s := string(buffer[0:bytesRead])
61			var msg Msg
62			err := json.Unmarshal([]byte(s), &msg)
63			check(err)
64			log.Println("[New msg] [Title]: " + msg.Type + " [Content]: " + msg.Content)
65			color.Green(msg.Content)
66		}
67	}
68	//TODO add that if the peer closed is the p2p server, show a warning message at the peer
69	log.Println("Peer: " + conn.RemoteAddr().String() + " connection closed")
70	conn.Close()
71}