func (m *mdnsService) handleEntry(e *mdns.ServiceEntry) { mpeer, err := peer.IDB58Decode(e.Info) if err != nil { log.Warning("Error parsing peer ID from mdns entry: ", err) return } if mpeer == m.host.ID() { return } maddr, err := manet.FromNetAddr(&net.TCPAddr{ IP: e.AddrV4, Port: e.Port, }) if err != nil { log.Warning("Error parsing multiaddr from mdns entry: ", err) return } pi := peer.PeerInfo{ ID: mpeer, Addrs: []ma.Multiaddr{maddr}, } m.lk.Lock() for _, n := range m.notifees { n.HandlePeerFound(pi) } m.lk.Unlock() }
func Serve(node *core.IpfsNode, lis net.Listener, options ...ServeOption) error { handler, err := makeHandler(node, lis, options...) if err != nil { return err } addr, err := manet.FromNetAddr(lis.Addr()) if err != nil { return err } // if the server exits beforehand var serverError error serverExited := make(chan struct{}) node.Process().Go(func(p goprocess.Process) { serverError = http.Serve(lis, handler) close(serverExited) }) // wait for server to exit. select { case <-serverExited: // if node being closed before server exits, close server case <-node.Process().Closing(): log.Infof("server at %s terminating...", addr) lis.Close() outer: for { // wait until server exits select { case <-serverExited: // if the server exited as we are closing, we really dont care about errors serverError = nil break outer case <-time.After(5 * time.Second): log.Infof("waiting for server at %s to terminate...", addr) } } } log.Infof("server at %s terminated", addr) return serverError }
func newSilentPeer(t *testing.T) (peer.ID, ma.Multiaddr, net.Listener) { dst := testutil.RandPeerIDFatal(t) lst, err := net.Listen("tcp", ":0") if err != nil { t.Fatal(err) } addr, err := manet.FromNetAddr(lst.Addr()) if err != nil { t.Fatal(err) } addrs := []ma.Multiaddr{addr} addrs, err = addrutil.ResolveUnspecifiedAddresses(addrs, nil) if err != nil { t.Fatal(err) } t.Log("new silent peer:", dst, addrs[0]) return dst, addrs[0], lst }