peer.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package p2p
  2. import (
  3. "fmt"
  4. "net"
  5. "strconv"
  6. )
  7. type Peer struct {
  8. // quit chan chan bool
  9. Inbound bool // inbound (via listener) or outbound (via dialout)
  10. Address net.Addr
  11. Host []byte
  12. Port uint16
  13. Pubkey []byte
  14. Id string
  15. Caps []string
  16. peerErrorChan chan *PeerError
  17. messenger *Messenger
  18. peerErrorHandler *PeerErrorHandler
  19. server *Server
  20. }
  21. func (self *Peer) Messenger() *Messenger {
  22. return self.messenger
  23. }
  24. func (self *Peer) PeerErrorChan() chan *PeerError {
  25. return self.peerErrorChan
  26. }
  27. func (self *Peer) Server() *Server {
  28. return self.server
  29. }
  30. func NewPeer(conn net.Conn, address net.Addr, inbound bool, server *Server) *Peer {
  31. peerErrorChan := NewPeerErrorChannel()
  32. host, port, _ := net.SplitHostPort(address.String())
  33. intport, _ := strconv.Atoi(port)
  34. peer := &Peer{
  35. Inbound: inbound,
  36. Address: address,
  37. Port: uint16(intport),
  38. Host: net.ParseIP(host),
  39. peerErrorChan: peerErrorChan,
  40. server: server,
  41. }
  42. connection := NewConnection(conn, peerErrorChan)
  43. peer.messenger = NewMessenger(peer, connection, peerErrorChan, server.Handlers())
  44. peer.peerErrorHandler = NewPeerErrorHandler(address, server.PeerDisconnect(), peerErrorChan, server.Blacklist())
  45. return peer
  46. }
  47. func (self *Peer) String() string {
  48. var kind string
  49. if self.Inbound {
  50. kind = "inbound"
  51. } else {
  52. kind = "outbound"
  53. }
  54. return fmt.Sprintf("%v:%v (%s) v%v %v", self.Host, self.Port, kind, self.Id, self.Caps)
  55. }
  56. func (self *Peer) Write(protocol string, msg *Msg) error {
  57. return self.messenger.Write(protocol, msg)
  58. }
  59. func (self *Peer) Start() {
  60. self.peerErrorHandler.Start()
  61. self.messenger.Start()
  62. }
  63. func (self *Peer) Stop() {
  64. self.peerErrorHandler.Stop()
  65. self.messenger.Stop()
  66. // q := make(chan bool)
  67. // self.quit <- q
  68. // <-q
  69. }
  70. func (p *Peer) Encode() []interface{} {
  71. return []interface{}{p.Host, p.Port, p.Pubkey}
  72. }