whisper: fix connection process

The node still needs to respond properly though
This commit is contained in:
Guillaume Ballet 2018-03-27 10:06:29 +02:00
parent 5628f88028
commit 5e5ae75be5

View file

@ -17,6 +17,7 @@
package whisperv6 package whisperv6
import ( import (
"github.com/ethereum/go-ethereum/log"
"bytes" "bytes"
"context" "context"
"encoding/binary" "encoding/binary"
@ -165,10 +166,38 @@ type LibP2PWhisperServer struct {
whisper *Whisper whisper *Whisper
} }
func (server *LibP2PWhisperServer) connectToPeer(p *LibP2PPeer) error {
log.Info("opening stream to peer: ", p.id.Pretty(), "from peer", server.Host.ID().Pretty())
// Create a stream with the peer
s, err := server.Host.NewStream(context.Background(), p.id, WhisperProtocolString)
if err != nil {
panic(err)
}
// Save the stream
lps := LibP2PStream{
stream: s,
}
p.connectionStream = &lps
// Send a first message to notify the remote peer we want
// to connect
connectMsg := p2p.Msg{
Code: lp2pPeerCode,
Size: 0,
Payload: bytes.NewReader([]byte{0}),
}
err = lps.WriteMsg(connectMsg)
return err
}
// Start starts the server // Start starts the server
func (server *LibP2PWhisperServer) Start() error { func (server *LibP2PWhisperServer) Start() error {
server.Host.SetStreamHandler(WhisperProtocolString, func (stream inet.Stream) { server.Host.SetStreamHandler(WhisperProtocolString, func (stream inet.Stream) {
defer stream.Close() log.Info("opening stream from new peer")
pid := stream.Conn().RemotePeer() pid := stream.Conn().RemotePeer()
var peer Peer var peer Peer
@ -188,48 +217,20 @@ func (server *LibP2PWhisperServer) Start() error {
server.Peers = append(server.Peers, peer.(*LibP2PPeer)) server.Peers = append(server.Peers, peer.(*LibP2PPeer))
} }
server.whisper.runMessageLoop(peer, lps) go server.whisper.runMessageLoop(peer, lps)
}) })
fmt.Println("Currently having the following peers:", server.Peers) fmt.Println("Currently having the following peers:", server.Peers)
// Open a stream to every peer currently known // Open a stream to every peer currently known
var err error
for _, p := range server.Peers { for _, p := range server.Peers {
fmt.Println("opening stream to peer: ", p) if e := server.connectToPeer(p); e != nil {
// Do not dial to self - actually, this should raise err = e
// an exception rather than be ignored
// if pid == server.Host.ID() {
// continue
// }
// Create a stream with the peer
s, err := server.Host.NewStream(context.Background(), p.id, WhisperProtocolString)
if err != nil {
panic(err)
}
// Save the stream
lps := LibP2PStream{
stream: s,
}
p.connectionStream = &lps
// Send a first message to notify the remote peer we want
// to connect
connectMsg := p2p.Msg{
Code: lp2pPeerCode,
Size: 0,
Payload: bytes.NewReader([]byte{}),
}
err = lps.WriteMsg(connectMsg)
if err != nil {
// XXX
panic(err)
} }
} }
return nil return err
} }
// Stop stops the server // Stop stops the server
@ -257,7 +258,7 @@ func (server *LibP2PWhisperServer) Enode() string {
// AddPeer is a helper function to add peers to the server // AddPeer is a helper function to add peers to the server
func (server *LibP2PWhisperServer) AddPeer(addr ma.Multiaddr) *LibP2PPeer { func (server *LibP2PWhisperServer) AddPeer(addr ma.Multiaddr) *LibP2PPeer {
fmt.Println("Adding peer: ", addr) log.Info("Adding peer: ", addr)
pid, err := addr.ValueForProtocol(ma.P_IPFS) pid, err := addr.ValueForProtocol(ma.P_IPFS)
if err != nil { if err != nil {
// XXX // XXX