hashicorp / mdns

Simple mDNS client/server library in Golang
MIT License
1.19k stars 210 forks source link

Multiple Answer RRs are not sent as separate entries #92

Open mmadraimov92 opened 2 years ago

mmadraimov92 commented 2 years ago

Hello,

Thank you for the library!

I am using library to discover specific services on local network by querying service type. There can be multiple services of the same type from same machine/device. There is an issue I have encountered, query responses that have multiple answers are not reported as separate entries.

Checkout wireshark screenshot:

Screenshot 2022-04-06 at 16 16 50

Here 192.168.80.92 is the address of device running the client code. 192.168.80.182 is the server which responds to mdns queries (it is windows machine, uses bonjour service). As you can see from screenshot, the are 2 services of type _itxpt_http._tcp. The Answer section contains 2 records, + additional records for each of these 2 answers.

The client code:

package main

import (
    "context"
    "fmt"
    "os"
    "os/signal"
    "time"

    "github.com/hashicorp/mdns"
)

func main() {
    timeout := 2 * time.Second
    ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
    ctx, cancel := context.WithTimeout(ctx, timeout)
    defer cancel()

    entriesCh := make(chan *mdns.ServiceEntry, 4)
    go mdns.Query(&mdns.QueryParam{
        Service:     "_itxpt_http._tcp",
        Entries:     entriesCh,
        DisableIPv6: true,
        Domain:      "local",
        Timeout:     timeout,
    })

    for {
        select {
        case entry := <-entriesCh:
            fmt.Println("Got new entry:", entry.Name)
        case <-ctx.Done():
            fmt.Println("done")
            return
        }
    }
}

Client only registers 1 entry, with values of second answer:

$ go run client.go
Got new entry: vehicle-1000_inventory._itxpt_http._tcp.local.
done

Is there a way to get these values as two separate entries? Like:

Got new entry: vehicle-1000_avms._itxpt_http._tcp.local.
Got new entry: vehicle-1000_inventory._itxpt_http._tcp.local.

It seems like the entry gets overwritten with the data from last answer in this loop: https://github.com/hashicorp/mdns/blob/v1.0.5/client.go#L272