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.
 
 
 
 
 

79 lines
2.1 KiB

package main
import (
"bufio"
"fmt"
"log"
"net"
"github.com/fatih/color"
)
func 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)
running = false
}
for running {
conn, err := l.Accept()
if err != nil {
log.Println("Error accepting peers. Error accepting connection")
running = false
}
var newPeer Peer
newPeer.IP = getIPFromConn(conn)
newPeer.Port = getPortFromConn(conn)
newPeer.Conn = conn
incomingPeersList = appendPeerIfNoExist(incomingPeersList, 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
outcomingPeersList = appendPeerIfNoExist(outcomingPeersList, 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 = outcomingPeersList
msgB := msg.toBytes()
_, err := conn.Write(msgB)
check(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, &outcomingPeersList)
color.Yellow("peer deleted, current peerList:")
printPeersList()
}