aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/peer.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-10-27 18:50:50 +0800
committerobscuren <geffobscura@gmail.com>2014-10-27 18:50:50 +0800
commit797b93c98cdd8183fca58f0c1c554b0d5af26d41 (patch)
tree10de24dc414b05cdb2a57dfa37db7e3f7a7c5605 /p2p/peer.go
parentb095bd32371f02d204a4d0fbde75dc58baa7430d (diff)
parentf62b6742f2189f45463c362897e9f49a11d811a2 (diff)
downloadgo-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.gz
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.bz2
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.lz
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.xz
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.tar.zst
go-tangerine-797b93c98cdd8183fca58f0c1c554b0d5af26d41.zip
Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop
Diffstat (limited to 'p2p/peer.go')
-rw-r--r--p2p/peer.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/p2p/peer.go b/p2p/peer.go
new file mode 100644
index 000000000..f4b68a007
--- /dev/null
+++ b/p2p/peer.go
@@ -0,0 +1,83 @@
+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}
+}