anchor.diff:      /// Useful for debugging.
       member __.Name = name
   
  +    /// Request information from a service. Assumes you'll handle messages via an instance
  +    /// of SsdpClient.
  +    static member SendServiceQueryAsync (serviceType : string,
  +                                         userAgent : string,
  +                                         multicastLoopback : bool) : Task<bool> =
  +
  +        async {
  +            let packet =
  +                MSearch
  +                    {
  +                        Host        = SsdpConstants.SsdpEndPointIPv4
  +                        MAN         = "\"ssdp:discover\""
  +                        MX          = ""
  +                        ST          = serviceType
  +                        UserAgent   = userAgent
  +                    }
  +                |> SsdpMessage.ToPacket
  +
  +            let addrs = SsdpNetworkInterfaces.getSspdAddresses() |> Seq.cache
  +            let sockets = addrs |> Seq.map (configUdp multicastLoopback) |> Seq.toList
  +            sockets |> List.iter (fun udp -> udp.Send(packet,
  +                                                      packet.Length,
  +                                                      SsdpConstants.SsdpEndPointIPv4)
  +                                                  |> ignore
  +                                             udp.Close())
  +            return addrs |> Seq.length > 0
  +        }
  +        |> Async.StartAsTask
  +
       /// Request information from a service. `onMessage` may be called on multiple
       /// threads concurrently.
       [<CompiledName("SearchFSharp")>]
  
positive.code:                 |> SsdpMessage.ToPacket
  
              let addrs = SsdpNetworkInterfaces.getSspdAddresses() |> Seq.cache
              let sockets = addrs |> Seq.map configUdp |> Seq.toList
              sockets |> List.iter (fun udp -> udp.Send(packet,
                                                        packet.Length,
                                                        SsdpConstants.SsdpEndPointIPv4)
  
negative.code: open System.Net.Sockets
  open System.Threading.Tasks
  open System.Threading.Tasks.Dataflow
  
  module private SsdpClientDetails =
  
      let configUdp multicastLoopback (addr : IPAddress) =
          let udp = new UdpClient()
          udp.Client.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true)
          udp.Client.Bind(IPEndPoint(addr, 0))
          udp.JoinMulticastGroup(SsdpConstants.SsdpEndPointIPv4.Address, addr)
          udp.MulticastLoopback <- multicastLoopback
          udp
  
  open SsdpClientDetails
  
  /// Client interface for listening to SSDP messages.
  type SsdpClient (name : string, multicastLoopback : bool, debugLogging : bool) =
  