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}