rosetta-home / mdns Goto Github PK
View Code? Open in Web Editor NEWbasic mdns server and discovery client
License: Other
basic mdns server and discovery client
License: Other
I'm not too familiar with mdns, so perhaps this is how it is supposed to work, but...
I have a Node.js service that I'm advertising as trace-appliance._trap-tracer._udp.local
.
In my Elixir app, I query for that string.
Tracing the handle_info callbacks, I see messages such as those down below.
The first is a correct response, giving the IP and port of my service.
The others however are responses for the AFP service. They've been selected because the
list of services they contain includes what I'm guessing are all the services advertised by my box.
Looking at the code, the mdns client seems to accept a message if any of the services it contains is a substring of the query.
Am I using it incorrectly?
Dave
==================================================
{:"trace-appliance._trap-tracer._udp.local",
%Mdns.Client.Device{
domain: "laptop.lan.local",
ip: {192, 168, 86, 173},
payload: %{},
port: 51516,
services: ["trace-appliance._trap-tracer._udp.local",
"_trap-tracer._udp.local"]
}}
==================================================
{:"trace-appliance._trap-tracer._udp.local",
%Mdns.Client.Device{
domain: "laptop.local",
ip: {192, 168, 86, 173},
payload: %{},
port: 7000,
services: [
<<192, 56, 0, 4, 64, 0, 0, 8>>,
"laptop.local",
<<192, 12, 0, 5, 0, 0, 128, 0, 64>>,
"laptop._airplay._tcp.local",
"trace-appliance._trap-tracer._udp.local",
"_trap-tracer._udp.local"
]
}}
==================================================
{:"trace-appliance._trap-tracer._udp.local",
%Mdns.Client.Device{
domain: "laptop.local",
ip: {192, 168, 86, 173},
payload: %{},
port: 7000,
services: [
<<192, 66, 0, 4, 64, 0, 0, 8>>,
"laptop.local",
<<192, 12, 0, 5, 0, 0, 128, 0, 64>>,
"F01898668893@laptop._raop._tcp.local",
<<192, 56, 0, 4, 64, 0, 0, 8>>,
"laptop._airplay._tcp.local",
"trace-appliance._trap-tracer._udp.local",
"_trap-tracer._udp.local"
]
}}
This results in a timeout the first time that you try to contact the device running the mdns
library. The second or third time seem to be ok.
I'd like to advertise an ssh
service so that a laptop running on the same LAN can discover the device. I've tried avahi-browse _ssh._tcp
on my Linux laptop and made several attempts with registering a service. Is there an example somewhere on how to do this? or something similar that I could modify? I saw that you could register PTR and TXT records in the readme, but my attempts to use those have failed.
When I'm start a server with following records:
[
# create domain for an ip
%Mdns.Server.Service{domain: "somedomain.local", data: :ip, ttl: 450, type: :a},
# make service discoverable
%Mdns.Server.Service{domain: "_services._dns-sd._udp.local",data: "_ssh._tcp.local",ttl: 4500, type: :ptr},
# register ssh service
%Mdns.Server.Service{domain: "_ssh._tcp.local",data: "SOME NAME._ssh._tcp.local",ttl: 4500, type: :ptr},
# point service to our domain and port (22)
%Mdns.Server.Service{domain: "SOME NAME._ssh._tcp.local",data: {0,0,22, 'somedomain.local'},ttl: 4500,type: :srv},
# empty txt service (some tools expext that)
%Mdns.Server.Service{domain: "SOME NAME._ssh._tcp.local",data: [],ttl: 4500,type: :txt})
] |> Enum.each(&Mdns.Server.add_service/1)
Tools like Avahi Discovery, Avahi SSH Server Browse, mdns-scan works fine.
But when I'm trying to find device with Mdns.Client
the domain is nil
.
After a little research this condition https://github.com/rosetta-home/mdns/blob/master/lib/mdns/server.ex#L106 prevent to send :a
record witch Mdns.Client
is looking for. On the other side other tools resolve domain correctly.
Should Mdns.Server
always send :a
record od Mds.Client
should resolve domain in a different way?
I've been playing with Mdns.Server and Mdns.Client for a little while, but I can't figure out how to serve a record with a payload. I want to do something like the googlecast example in the Readme:
Is that possible with this mdns Elixir library?
{:"_googlecast._tcp.local",
%Mdns.Client.Device{
domain: "CRT-Labs.local",
ip: {192, 168, 1, 138},
payload: %{
"bs" => "FA8FCA79C426",
"ca" => "4101",
"fn" => "CRT-Labs",
"ic" => "/setup/icon.png",
"id" => "e0617de7e2df63476fab257c8327ef3b",
"md" => "Chromecast",
"rm" => "E81C9A486980AA48",
"rs" => "",
"st" => "0",
"ve" => "05"
},
services: [
"CRT-Labs._googlecast._tcp.local"
]
}
}
Hi!
I am trying to use your library to resolve mDNS ICE candidates that different browsers send while establishing the connection.
When ICE candidate ends with .local
I am trying to resolve it by
Mdns.Client.query("some-string.local")
Before it I have done
Mdns.Client.start()
Mdns.Client.register()
While executing the above query I can see in wireshark:
So there is a queary and a response.
The library logs it by
13:20:20.283 [debug] mDNS got response: %DNS.Record{anlist: [%DNS.Resource{bm: [], class: 32769, cnt: 0, data: <<192, 12, 0, 4, 0, 0, 0, 8>>, domain: '3b36c03b-71c2-4fa6-b683-64275f83fc0e.local', func: false, tm: :undefined, ttl: 120, type: 47}], arlist: [%DNS.Resource{bm: [], class: 32769, cnt: 0, data: <<42, 1, 17, 223, 3, 113, 137, 0, 178, 64, 52, 238, 125, 138, 184, 48>>, domain: '3b36c03b-71c2-4fa6-b683-64275f83fc0e.local', func: false, tm: :undefined, ttl: 120, type: :aaaa}], header: %DNS.Header{aa: true, id: 0, opcode: :query, pr: false, qr: true, ra: false, rcode: 0, rd: false, tc: false}, nslist: [], qdlist: []}
13:20:20.283 [debug] mDNS got response: %DNS.Record{anlist: [%DNS.Resource{bm: [], class: 32769, cnt: 0, data: <<192, 12, 0, 4, 0, 0, 0, 8>>, domain: '3b36c03b-71c2-4fa6-b683-64275f83fc0e.local', func: false, tm: :undefined, ttl: 120, type: 47}], arlist: [%DNS.Resource{bm: [], class: 32769, cnt: 0, data: <<42, 1, 17, 223, 3, 113, 137, 0, 178, 64, 52, 238, 125, 138, 184, 48>>, domain: '3b36c03b-71c2-4fa6-b683-64275f83fc0e.local', func: false, tm: :undefined, ttl: 120, type: :aaaa}], header: %DNS.Header{aa: true, id: 0, opcode: :query, pr: false, qr: true, ra: false, rcode: 0, rd: false, tc: false}, nslist: [], qdlist: []}
but I don't get any notifications which is probably caused by this code
Lines 115 to 127 in 83c6871
So my question is why this response is filtered out and I am not notified about it?
Also tried to implement mDNS lookup in C in this way
char *rest;
char *candidate_cpy = (char *)calloc(1024, sizeof(char));
char *prefix = strtok_r(candidate, " ", &rest);
char *component = strtok_r(NULL, " ", &rest);
char *proto = strtok_r(NULL, " ", &rest);
char *prio = strtok_r(NULL, " ", &rest);
char *addr = strtok_r(NULL, " ", &rest);
char *addr_postfix_ptr = strrchr(addr, '.');
// check if addr ends with .local
if (addr_postfix_ptr && !strcmp(addr_postfix_ptr, ".local")) {
struct addrinfo *addrinfo;
int ret = getaddrinfo(addr, NULL, NULL, &addrinfo);
fprintf(stderr, "ret %d for %s\n", ret, addr);
}
but this piece of code doesn't make any mDNS queries ๐ค It does only DNS ones so I suppose I am missing something about mDNS protocol itself?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.