diff options
author | obscuren <geffobscura@gmail.com> | 2014-01-10 17:58:46 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-01-10 17:58:46 +0800 |
commit | 19addcb51a1d100db483be98ee660b73dd5070d7 (patch) | |
tree | 235e82eb1e35accd18f016880e426f4ab5e2adc7 /peer.go | |
parent | ce40e51ae53af9679e11f8ced934ae8ee3b2db6f (diff) | |
download | dexon-19addcb51a1d100db483be98ee660b73dd5070d7.tar dexon-19addcb51a1d100db483be98ee660b73dd5070d7.tar.gz dexon-19addcb51a1d100db483be98ee660b73dd5070d7.tar.bz2 dexon-19addcb51a1d100db483be98ee660b73dd5070d7.tar.lz dexon-19addcb51a1d100db483be98ee660b73dd5070d7.tar.xz dexon-19addcb51a1d100db483be98ee660b73dd5070d7.tar.zst dexon-19addcb51a1d100db483be98ee660b73dd5070d7.zip |
Comments
Diffstat (limited to 'peer.go')
-rw-r--r-- | peer.go | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -31,6 +31,7 @@ func ReadMessage(conn net.Conn) (*InMsg, error) { // XXX The data specification is made up. This will change once more details have been released on the specification of the format decoder := NewRlpDecoder(buff[:n]) t := decoder.Get(0).AsString() + // If the msgdata contains no data we throw an error and disconnect the peer if t == "" { return nil, errors.New("Data contained no data type") } @@ -39,9 +40,13 @@ func ReadMessage(conn net.Conn) (*InMsg, error) { } type Peer struct { + // Server interface server *Server + // Net connection conn net.Conn + // Output queue which is used to communicate and handle messages outputQueue chan OutMsg + // Quit channel quit chan bool } @@ -60,21 +65,28 @@ func (p *Peer) QueueMessage(msgType string, data []byte) { p.outputQueue <- OutMsg{msgType: msgType, data: data} } +// Outbound message handler. Outbound messages are handled here func (p *Peer) HandleOutbound() { out: for { select { + // Main message queue. All outbound messages are processed through here case msg := <-p.outputQueue: + // TODO Message checking and handle accordingly p.WriteMessage(msg) + // Break out of the for loop if a quit message is posted case <- p.quit: break out } } } +// Write a message to the peer. func (p *Peer) WriteMessage(msg OutMsg) { + // Encode the type and the (RLP encoded) data for sending over the wire encoded := Encode([]interface{}{ msg.msgType, msg.data }) + // Write to the connection _, err := p.conn.Write(encoded) if err != nil { log.Println(err) @@ -82,11 +94,13 @@ func (p *Peer) WriteMessage(msg OutMsg) { } } +// Inbound handler. Inbound messages are received here and passed to the appropriate methods func (p *Peer) HandleInbound() { defer p.Stop() out: for { + // Wait for a message from the peer msg, err := ReadMessage(p.conn) if err != nil { log.Println(err) @@ -104,7 +118,9 @@ out: } func (p *Peer) Start() { + // Run the outbound handler in a new goroutine go p.HandleOutbound() + // Run the inbound handler in a new goroutine go p.HandleInbound() } |