aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/peer.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2015-02-27 11:06:55 +0800
committerFelix Lange <fjl@twurst.com>2015-03-04 19:27:23 +0800
commit736e632215d49dd7bc61126f78dda4bad12768ea (patch)
tree063327c533fd57620e0448f331832e79f9ba0dda /p2p/peer.go
parent51e01cceca81bc5e82896815754b7c33bb6e6005 (diff)
downloaddexon-736e632215d49dd7bc61126f78dda4bad12768ea.tar
dexon-736e632215d49dd7bc61126f78dda4bad12768ea.tar.gz
dexon-736e632215d49dd7bc61126f78dda4bad12768ea.tar.bz2
dexon-736e632215d49dd7bc61126f78dda4bad12768ea.tar.lz
dexon-736e632215d49dd7bc61126f78dda4bad12768ea.tar.xz
dexon-736e632215d49dd7bc61126f78dda4bad12768ea.tar.zst
dexon-736e632215d49dd7bc61126f78dda4bad12768ea.zip
p2p: use RLPx frames for messaging
Diffstat (limited to 'p2p/peer.go')
-rw-r--r--p2p/peer.go21
1 files changed, 12 insertions, 9 deletions
diff --git a/p2p/peer.go b/p2p/peer.go
index fb027c834..4982c4612 100644
--- a/p2p/peer.go
+++ b/p2p/peer.go
@@ -40,6 +40,7 @@ type Peer struct {
// Use them to display messages related to the peer.
*logger.Logger
+ conn net.Conn
rw *conn
running map[string]*protoRW
@@ -52,8 +53,9 @@ type Peer struct {
// NewPeer returns a peer for testing purposes.
func NewPeer(id discover.NodeID, name string, caps []Cap) *Peer {
pipe, _ := net.Pipe()
- conn := newConn(pipe, &protoHandshake{ID: id, Name: name, Caps: caps})
- peer := newPeer(conn, nil)
+ msgpipe, _ := MsgPipe()
+ conn := &conn{msgpipe, &protoHandshake{ID: id, Name: name, Caps: caps}}
+ peer := newPeer(pipe, conn, nil)
close(peer.closed) // ensures Disconnect doesn't block
return peer
}
@@ -76,12 +78,12 @@ func (p *Peer) Caps() []Cap {
// RemoteAddr returns the remote address of the network connection.
func (p *Peer) RemoteAddr() net.Addr {
- return p.rw.RemoteAddr()
+ return p.conn.RemoteAddr()
}
// LocalAddr returns the local address of the network connection.
func (p *Peer) LocalAddr() net.Addr {
- return p.rw.LocalAddr()
+ return p.conn.LocalAddr()
}
// Disconnect terminates the peer connection with the given reason.
@@ -98,10 +100,11 @@ func (p *Peer) String() string {
return fmt.Sprintf("Peer %.8x %v", p.rw.ID[:], p.RemoteAddr())
}
-func newPeer(conn *conn, protocols []Protocol) *Peer {
- logtag := fmt.Sprintf("Peer %.8x %v", conn.ID[:], conn.RemoteAddr())
+func newPeer(fd net.Conn, conn *conn, protocols []Protocol) *Peer {
+ logtag := fmt.Sprintf("Peer %.8x %v", conn.ID[:], fd.RemoteAddr())
p := &Peer{
Logger: logger.NewLogger(logtag),
+ conn: fd,
rw: conn,
running: matchProtocols(protocols, conn.Caps, conn),
disc: make(chan DiscReason),
@@ -138,7 +141,7 @@ loop:
// We rely on protocols to abort if there is a write error. It
// might be more robust to handle them here as well.
p.DebugDetailf("Read error: %v\n", err)
- p.rw.Close()
+ p.conn.Close()
return DiscNetworkError
case err := <-p.protoErr:
reason = discReasonForError(err)
@@ -161,14 +164,14 @@ func (p *Peer) politeDisconnect(reason DiscReason) {
EncodeMsg(p.rw, discMsg, uint(reason))
// Wait for the other side to close the connection.
// Discard any data that they send until then.
- io.Copy(ioutil.Discard, p.rw)
+ io.Copy(ioutil.Discard, p.conn)
close(done)
}()
select {
case <-done:
case <-time.After(disconnectGracePeriod):
}
- p.rw.Close()
+ p.conn.Close()
}
func (p *Peer) readLoop() error {