arnaucube
arnaucube/bcPublic Self-hosted repository
bc/peer/p2plib/connections.go
peer/p2plib/connections.goRaw
 1package p2plib
 2
 3import (
 4	"bufio"
 5	"fmt"
 6	"log"
 7	"net"
 8
 9	"github.com/fatih/color"
10)
11
12func (tp *ThisPeer) 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		tp.Running = false
18	}
19	for tp.Running {
20		conn, err := l.Accept()
21		if err != nil {
22			log.Println("Error accepting peers. Error accepting connection")
23			tp.Running = false
24		}
25		var newPeer Peer
26		newPeer.IP = GetIPFromConn(conn)
27		newPeer.Port = GetPortFromConn(conn)
28		newPeer.Conn = conn
29		globalTP.PeersConnections.Incoming = AppendPeerIfNoExist(globalTP.PeersConnections.Incoming, 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	globalTP.PeersConnections.Outcoming = AppendPeerIfNoExist(globalTP.PeersConnections.Outcoming, 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 = globalTP.PeersConnections.Outcoming
52	msgB := msg.ToBytes()
53	_, err := conn.Write(msgB)
54	if err != nil {
55		log.Println(err)
56	}
57
58	for connRunning {
59		/*
60			buffer := make([]byte, 1024)
61			bytesRead, err := conn.Read(buffer)
62		*/
63		newmsg, err := bufio.NewReader(conn).ReadString('\n')
64		if err != nil {
65			log.Println(err)
66			connRunning = false
67		} else {
68			var msg Msg
69			//msg = msg.createFromBytes([]byte(string(buffer[0:bytesRead])))
70			msg = msg.CreateFromBytes([]byte(newmsg))
71			MessageHandler(connPeer, msg)
72		}
73	}
74	//TODO add that if the peer closed is the p2p server, show a warning message at the peer
75	log.Println("Peer: " + conn.RemoteAddr().String() + " connection closed")
76	conn.Close()
77	//TODO delete the peer from the outcomingPeersList --> DONE
78	DeletePeerFromPeersList(connPeer, &globalTP.PeersConnections.Outcoming)
79	/*color.Yellow("peer deleted, current peerList:")
80	PrintPeersList()*/
81}