| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package p2p
- import (
- "fmt"
- "net"
- "strconv"
- )
- type Peer struct {
- // quit chan chan bool
- Inbound bool // inbound (via listener) or outbound (via dialout)
- Address net.Addr
- Host []byte
- Port uint16
- Pubkey []byte
- Id string
- Caps []string
- peerErrorChan chan *PeerError
- messenger *Messenger
- peerErrorHandler *PeerErrorHandler
- server *Server
- }
- func (self *Peer) Messenger() *Messenger {
- return self.messenger
- }
- func (self *Peer) PeerErrorChan() chan *PeerError {
- return self.peerErrorChan
- }
- func (self *Peer) Server() *Server {
- return self.server
- }
- func NewPeer(conn net.Conn, address net.Addr, inbound bool, server *Server) *Peer {
- peerErrorChan := NewPeerErrorChannel()
- host, port, _ := net.SplitHostPort(address.String())
- intport, _ := strconv.Atoi(port)
- peer := &Peer{
- Inbound: inbound,
- Address: address,
- Port: uint16(intport),
- Host: net.ParseIP(host),
- peerErrorChan: peerErrorChan,
- server: server,
- }
- connection := NewConnection(conn, peerErrorChan)
- peer.messenger = NewMessenger(peer, connection, peerErrorChan, server.Handlers())
- peer.peerErrorHandler = NewPeerErrorHandler(address, server.PeerDisconnect(), peerErrorChan, server.Blacklist())
- return peer
- }
- func (self *Peer) String() string {
- var kind string
- if self.Inbound {
- kind = "inbound"
- } else {
- kind = "outbound"
- }
- return fmt.Sprintf("%v:%v (%s) v%v %v", self.Host, self.Port, kind, self.Id, self.Caps)
- }
- func (self *Peer) Write(protocol string, msg *Msg) error {
- return self.messenger.Write(protocol, msg)
- }
- func (self *Peer) Start() {
- self.peerErrorHandler.Start()
- self.messenger.Start()
- }
- func (self *Peer) Stop() {
- self.peerErrorHandler.Stop()
- self.messenger.Stop()
- // q := make(chan bool)
- // self.quit <- q
- // <-q
- }
- func (p *Peer) Encode() []interface{} {
- return []interface{}{p.Host, p.Port, p.Pubkey}
- }
|