Pustaka ini hanya menyediakan header mDNS lintas platform dan pustaka DNS-DS di C. Kode sumber terbaru selalu tersedia di
https://github.com/mjansson/mdns
Perpustakaan ini dimasukkan ke dalam domain publik; Anda dapat mendistribusikan ulang dan/atau memodifikasinya tanpa batasan apa pun.
Dibuat oleh Mattias Jansson (@maniccoder)
Server perselisihan untuk diskusi https://discord.gg/M8BwTQrt6c
Pustaka melakukan penemuan dan layanan DNS-SD serta kueri dan respons mDNS rekaman tunggal sekali pakai. Tidak ada alokasi memori yang dilakukan oleh perpustakaan, semua buffer yang digunakan harus diteruskan oleh pemanggil. Data khusus untuk digunakan dalam pemrosesan dapat diteruskan menggunakan penunjuk buram data pengguna.
File uji mdns.c
yang dapat dieksekusi menunjukkan penggunaan semua fitur, termasuk penemuan, kueri, dan respons layanan. Dokumentasi di sini sengaja dibuat sedikit, kode contoh didokumentasikan dengan baik dan harus memberikan semua detailnya.
Soket untuk komunikasi mDNS dapat dibuka oleh perpustakaan dengan menggunakan mdns_socket_open_ipv4
atau mdns_socket_open_ipv6
, atau dengan menginisialisasi soket yang ada dengan mdns_socket_setup_ipv4
atau mdns_socket_setup_ipv6
. Fungsi pembukaan/pengaturan soket akan menginisialisasi soket dengan keanggotaan multicast (termasuk loopback) dan diatur ke mode non-pemblokiran.
Panggil mdns_socket_close
untuk menutup soket yang dibuka dengan mdns_socket_open_ipv4
atau mdns_socket_open_ipv6
.
Untuk membuka/mengatur soket untuk kueri sekali pakai, Anda dapat meneruskan alamat soket penunjuk nol, atau menyetel port di alamat soket yang diteruskan ke 0. Ini akan mengikat soket ke port UDP lokal sementara acak seperti yang disyaratkan oleh RFC untuk pertanyaan sekali pakai. Anda TIDAK boleh mengikat ke port 5353 saat melakukan kueri sekali pakai (lihat RFC untuk detailnya).,
Untuk membuka/mengatur soket untuk layanan, menanggapi pertanyaan masuk, Anda perlu memasukkan struktur alamat soket dengan port yang disetel ke 5353 (didefinisikan oleh MDNS_PORT di header). Anda tidak dapat memilih port lain atau Anda tidak akan menerima pertanyaan masuk apa pun.
Untuk melakukan penemuan atau kueri pada antarmuka jaringan default, Anda dapat meneruskan penunjuk nol sebagai alamat soket di fungsi pembuatan/penyiapan soket. Ini akan mengikat soket ke antarmuka jaringan default. Jika tidak, Anda harus menghitung antarmuka yang tersedia dan meneruskan alamat soket yang sesuai ke fungsi buat/pengaturan. Lihat contoh program di mdns.c
untuk contoh implementasi melakukan hal ini untuk IPv4 dan IPv6.
Jika Anda ingin melakukan respons layanan mDNS terhadap permintaan masuk, Anda tidak perlu menghitung antarmuka untuk melakukan respons layanan pada semua antarmuka karena soket menerima data dari semua antarmuka. Lihat contoh program di mdns.c
untuk contoh pengaturan soket layanan untuk IPv4 dan IPv6.
Untuk mengirim permintaan penemuan layanan DNS-SD gunakan mdns_discovery_send
. Ini akan mengirimkan satu paket multicast (catatan pertanyaan PTR tunggal untuk _services._dns-sd._udp.local.
) yang meminta respons unicast.
Untuk membaca respons penemuan, gunakan mdns_discovery_recv
. Semua catatan yang diterima sejak panggilan terakhir akan disalurkan ke panggilan balik yang disediakan dalam pemanggilan fungsi. Jenis entrinya adalah MDNS_ENTRYTYPE_ANSWER
, MDNS_ENTRYTYPE_AUTHORITY
dan MDNS_ENTRYTYPE_ADDITIONAL
.
Untuk mengirim kueri mDNS sekali pakai untuk satu catatan, gunakan mdns_query_send
. Ini akan mengirimkan satu paket multicast untuk record dan nama tertentu (misalnya record PTR untuk _http._tcp.local.
). Secara opsional, Anda dapat meneruskan ID kueri untuk kueri tersebut untuk memfilter respons di kemudian hari (walaupun hal ini tidak disarankan oleh RFC), atau meneruskan 0 agar sepenuhnya mematuhi kebijakan. Fungsi ini mengembalikan ID kueri yang terkait dengan kueri ini, yang jika bukan nol dapat digunakan untuk memfilter respons di mdns_query_recv
. Jika soket terikat ke port 5353, respons multicast akan diminta, jika tidak, respons unicast.
Untuk membaca respons kueri, gunakan mdns_query_recv
. Semua catatan yang diterima sejak panggilan terakhir akan disalurkan ke panggilan balik yang disediakan dalam pemanggilan fungsi. Jika parameter query_id
bukan nol, fungsi akan memfilter respons apa pun dengan ID kueri yang tidak cocok dengan ID kueri yang diberikan. Jenis entrinya adalah MDNS_ENTRYTYPE_ANSWER
, MDNS_ENTRYTYPE_AUTHORITY
dan MDNS_ENTRYTYPE_ADDITIONAL
.
Perhatikan bahwa soket yang dibuka untuk pertanyaan satu kali dari port sementara tidak akan menerima jawaban yang tidak diminta (pengumuman) karena ini dikirim sebagai multicast pada port 5353.
Untuk mengirim beberapa kueri dalam paket yang sama, gunakan mdns_multiquery_send
yang mengambil larik dan jumlah nama layanan serta tipe rekaman untuk dikueri.
Untuk mendengarkan permintaan DNS-SD yang masuk dan kueri mDNS, soket dapat dibuka/diatur pada antarmuka default dengan meneruskan 0 sebagai alamat soket dalam panggilan ke fungsi buka/pengaturan soket (soket akan menerima data dari semua antarmuka jaringan). Kemudian panggil mdns_socket_listen
baik saat pemberitahuan data masuk, atau dengan menyetel mode pemblokiran dan memanggil mdns_socket_listen
untuk memblokir hingga data tersedia dan diuraikan.
Tipe entri yang diteruskan ke panggilan balik adalah MDNS_ENTRYTYPE_QUESTION
dan tipe rekaman menunjukkan rekaman mana yang akan ditanggapi. Program contoh merespons catatan SRV, PTR, A dan AAAA. Gunakan fungsi mdns_string_extract
untuk mendapatkan string nama catatan layanan yang diminta.
Jika nama catatan layanan adalah _services._dns-sd._udp.local.
Anda harus menggunakan mdns_discovery_answer
untuk mengirim catatan layanan yang Anda berikan (DNS-SD).
Jika nama catatan layanan adalah layanan yang Anda berikan, gunakan mdns_query_answer_unicast
atau mdns_query_answer_multicast
bergantung pada tanda jenis respons dalam pertanyaan untuk mengirim kembali detail layanan sebagai respons terhadap kueri.
Lihat implementasi pengujian yang dapat dieksekusi untuk detail lebih lanjut tentang cara menangani parameter pada fungsi yang diberikan.
Jika Anda menyediakan layanan mDNS yang mendengarkan dan menjawab pertanyaan pada port 5353, disarankan untuk mengirimkan pengumuman saat layanan Anda dimulai (sebagai jawaban yang tidak diminta). Gunakan mdns_announce_multicast
untuk mengumumkan catatan layanan Anda saat startup, dan mdns_goodbye_multicast
untuk mengumumkan akhir layanan pada saat penghentian.
File mdns.c
berisi implementasi pengujian yang dapat dieksekusi menggunakan perpustakaan untuk melakukan kueri DNS-SD dan mDNS. Kompilasi menjadi file yang dapat dieksekusi dan jalankan untuk melihat opsi baris perintah untuk mode penemuan, kueri, dan layanan.
cl mdns.c /Zi /Fdmdns.pdb /link /out:mdns.exe ws2_32.lib iphlpapi.lib
gcc -o mdns mdns.c
clang -o mdns mdns.c
FetchContent
atau install dan find_package
mdns/20200130
, dan find_package
-> https://conan.io/center/mdns/20200130vcpkg install mdns
dan find_package