提交 0075a352 作者: Henry

only send local version once

上级 6b0440c0
...@@ -169,6 +169,10 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error { ...@@ -169,6 +169,10 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
return fmt.Errorf("connVersionExchange: could not prepare local version: %q", err) return fmt.Errorf("connVersionExchange: could not prepare local version: %q", err)
} }
// buffered channel to send our version just once
outBuf := make(chan []byte, 1)
outBuf <- myVersionMsg.Data()
var gotTheirs, sendMine bool var gotTheirs, sendMine bool
for { for {
if gotTheirs && sendMine { if gotTheirs && sendMine {
...@@ -184,9 +188,13 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error { ...@@ -184,9 +188,13 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
case <-remote.Closed: case <-remote.Closed:
return errors.New("remote closed connection during version exchange") return errors.New("remote closed connection during version exchange")
case remote.Secure.Out <- myVersionMsg.Data(): case our, ok := <-outBuf:
log.Debug("[peer: %s] Send my version(%s) to %s", s.local, myVersion, remote.Peer) if ok {
remote.Secure.Out <- our
sendMine = true sendMine = true
close(outBuf) // only send local version once
log.Debug("[peer: %s] Send my version(%s) to %s", s.local, myVersion, remote.Peer)
}
case data, ok := <-remote.Secure.In: case data, ok := <-remote.Secure.In:
if !ok { if !ok {
...@@ -202,6 +210,8 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error { ...@@ -202,6 +210,8 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
return fmt.Errorf("connSetup: could not decode remote version: %q", err) return fmt.Errorf("connSetup: could not decode remote version: %q", err)
} }
gotTheirs = true gotTheirs = true
// BUG(cryptix): could add another case here to trigger resending our version
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论