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

6 years ago
  1. package p2plib
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "net"
  7. "github.com/fatih/color"
  8. )
  9. func (tp *ThisPeer) AcceptPeers(peer Peer) {
  10. fmt.Println("accepting peers at: " + peer.Port)
  11. l, err := net.Listen("tcp", peer.IP+":"+peer.Port)
  12. if err != nil {
  13. log.Println("Error accepting peers. Listening port: " + peer.Port)
  14. tp.Running = false
  15. }
  16. for tp.Running {
  17. conn, err := l.Accept()
  18. if err != nil {
  19. log.Println("Error accepting peers. Error accepting connection")
  20. tp.Running = false
  21. }
  22. var newPeer Peer
  23. newPeer.IP = GetIPFromConn(conn)
  24. newPeer.Port = GetPortFromConn(conn)
  25. newPeer.Conn = conn
  26. globalTP.PeersConnections.Incoming = AppendPeerIfNoExist(globalTP.PeersConnections.Incoming, newPeer)
  27. go HandleConn(conn, newPeer)
  28. }
  29. }
  30. func ConnectToPeer(peer Peer) {
  31. color.Green("connecting to new peer")
  32. log.Println("Connecting to new peer: " + peer.IP + ":" + peer.Port)
  33. conn, err := net.Dial("tcp", peer.IP+":"+peer.Port)
  34. if err != nil {
  35. log.Println("Error connecting to: " + peer.IP + ":" + peer.Port)
  36. return
  37. }
  38. peer.Conn = conn
  39. globalTP.PeersConnections.Outcoming = AppendPeerIfNoExist(globalTP.PeersConnections.Outcoming, peer)
  40. go HandleConn(conn, peer)
  41. }
  42. func HandleConn(conn net.Conn, connPeer Peer) {
  43. connRunning := true
  44. log.Println("handling conn: " + conn.RemoteAddr().String())
  45. //reply to the conn, send the peerList
  46. var msg Msg
  47. msg.Construct("PeersList", "here my outcomingPeersList")
  48. msg.PeersList = globalTP.PeersConnections.Outcoming
  49. msgB := msg.ToBytes()
  50. _, err := conn.Write(msgB)
  51. if err != nil {
  52. log.Println(err)
  53. }
  54. for connRunning {
  55. /*
  56. buffer := make([]byte, 1024)
  57. bytesRead, err := conn.Read(buffer)
  58. */
  59. newmsg, err := bufio.NewReader(conn).ReadString('\n')
  60. if err != nil {
  61. log.Println(err)
  62. connRunning = false
  63. } else {
  64. var msg Msg
  65. //msg = msg.createFromBytes([]byte(string(buffer[0:bytesRead])))
  66. msg = msg.CreateFromBytes([]byte(newmsg))
  67. MessageHandler(connPeer, msg)
  68. }
  69. }
  70. //TODO add that if the peer closed is the p2p server, show a warning message at the peer
  71. log.Println("Peer: " + conn.RemoteAddr().String() + " connection closed")
  72. conn.Close()
  73. //TODO delete the peer from the outcomingPeersList --> DONE
  74. DeletePeerFromPeersList(connPeer, &globalTP.PeersConnections.Outcoming)
  75. /*color.Yellow("peer deleted, current peerList:")
  76. PrintPeersList()*/
  77. }