func EchoStreamHandler(stream inet.Stream) { go func() { defer stream.Close() // pull out the ipfs conn c := stream.Conn() log.Infof("%s ponging to %s", c.LocalPeer(), c.RemotePeer()) buf := make([]byte, 4) for { if _, err := stream.Read(buf); err != nil { if err != io.EOF { log.Info("ping receive error:", err) } return } if !bytes.Equal(buf, []byte("ping")) { log.Infof("ping receive error: ping != %s %v", buf, buf) return } if _, err := stream.Write([]byte("pong")); err != nil { log.Info("pond send error:", err) return } } }() }
//WriteResponse writes hash of recent to con. func WriteResponse(con net.Stream, recent key.Key) error { var r []byte if recent != "" { r = []byte(recent) } msg := &NodeProto{ Id: r, } dat, err := proto.Marshal(msg) if log.If(err) { return err } _, err = con.Write(dat) log.If(err) return err }
func (p *PingService) PingHandler(s inet.Stream) { buf := make([]byte, PingSize) for { _, err := io.ReadFull(s, buf) if err != nil { log.Debug(err) return } _, err = s.Write(buf) if err != nil { log.Debug(err) return } } }
//WriteRequest writes hash of recent and peers DAG to con. func WriteRequest(con net.Stream, recent key.Key, peers key.Key) error { var r, p []byte if peers != "" { p = []byte(peers) } if recent != "" { r = []byte(recent) } msg := &Msg{ Type: Type_Recent.Enum(), Recent: r, Peers: p, } dat, err := proto.Marshal(msg) if log.If(err) { return err } _, err = con.Write(dat) log.If(err) return err }
func ping(s inet.Stream) (time.Duration, error) { buf := make([]byte, PingSize) u.NewTimeSeededRand().Read(buf) before := time.Now() _, err := s.Write(buf) if err != nil { return 0, err } rbuf := make([]byte, PingSize) _, err = io.ReadFull(s, rbuf) if err != nil { return 0, err } if !bytes.Equal(buf, rbuf) { return 0, errors.New("ping packet was incorrect!") } return time.Now().Sub(before), nil }