You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

81 lines
2.3 KiB

package p2plib
import (
"bufio"
"fmt"
"log"
"net"
"github.com/fatih/color"
)
func (tp *ThisPeer) AcceptPeers(peer Peer) {
fmt.Println("accepting peers at: " + peer.Port)
l, err := net.Listen("tcp", peer.IP+":"+peer.Port)
if err != nil {
log.Println("Error accepting peers. Listening port: " + peer.Port)
tp.Running = false
}
for tp.Running {
conn, err := l.Accept()
if err != nil {
log.Println("Error accepting peers. Error accepting connection")
tp.Running = false
}
var newPeer Peer
newPeer.IP = GetIPFromConn(conn)
newPeer.Port = GetPortFromConn(conn)
newPeer.Conn = conn
globalTP.PeersConnections.Incoming = AppendPeerIfNoExist(globalTP.PeersConnections.Incoming, newPeer)
go HandleConn(conn, newPeer)
}
}
func ConnectToPeer(peer Peer) {
color.Green("connecting to new peer")
log.Println("Connecting to new peer: " + peer.IP + ":" + peer.Port)
conn, err := net.Dial("tcp", peer.IP+":"+peer.Port)
if err != nil {
log.Println("Error connecting to: " + peer.IP + ":" + peer.Port)
return
}
peer.Conn = conn
globalTP.PeersConnections.Outcoming = AppendPeerIfNoExist(globalTP.PeersConnections.Outcoming, peer)
go HandleConn(conn, peer)
}
func HandleConn(conn net.Conn, connPeer Peer) {
connRunning := true
log.Println("handling conn: " + conn.RemoteAddr().String())
//reply to the conn, send the peerList
var msg Msg
msg.Construct("PeersList", "here my outcomingPeersList")
msg.PeersList = globalTP.PeersConnections.Outcoming
msgB := msg.ToBytes()
_, err := conn.Write(msgB)
if err != nil {
log.Println(err)
}
for connRunning {
/*
buffer := make([]byte, 1024)
bytesRead, err := conn.Read(buffer)
*/
newmsg, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
log.Println(err)
connRunning = false
} else {
var msg Msg
//msg = msg.createFromBytes([]byte(string(buffer[0:bytesRead])))
msg = msg.CreateFromBytes([]byte(newmsg))
MessageHandler(connPeer, msg)
}
}
//TODO add that if the peer closed is the p2p server, show a warning message at the peer
log.Println("Peer: " + conn.RemoteAddr().String() + " connection closed")
conn.Close()
//TODO delete the peer from the outcomingPeersList --> DONE
DeletePeerFromPeersList(connPeer, &globalTP.PeersConnections.Outcoming)
/*color.Yellow("peer deleted, current peerList:")
PrintPeersList()*/
}