OyasumiVR::Mdns
OSCQuery サーバを mDNS で探すためのパケットの組み立てと解析(issue #54)。
ソケットを持たない純粋関数だけを置く。 送受信は repository が行い、ここは固定のバイト列で確かめられるようにしておく。
名前の比較は大文字と小文字を区別しない。DNS の名前はそう比べる決まりであり、 OyasumiVR も版によって "OyasumiVR" と、小文字にした "oyasumivr" のどちらでも名乗る。
Constants
CLASS_IN = 1_u16
HEADER_SIZE = 12
INSTANCE = "oyasumivr.#{SERVICE}"
MAX_POINTER_JUMPS = 64
圧縮ポインタを辿る回数の上限。壊れた応答がポインタで輪を作っても止まるようにする。
SERVICE = "_oscjson._tcp.local"
TYPE_PTR = 12_u16
TYPE_SRV = 33_u16
UNICAST_RESPONSE = 32768_u16
問い合わせの class の最上位ビット。応答を送信元へユニキャストで返すよう求める(RFC 6762 5.4 節)。
Class methods
応答から instance の SRV レコードを探し、そのポートを返す。無ければ nil を返す。
同じ種別には VRChat なども応えるため、ポートはインスタンス名で選ぶ。 SRV は回答にも追加にも置かれうるので、問い合わせ以外の全レコードを見る。 応答の形が崩れていても例外は出さず、見つからなかったものとして扱う。
query
_oscjson._tcp.local の PTR を問う 1 問だけのパケット。
一時ポートから送るため、応答はユニキャストで返ってくる。 5353 へ bind せずに済むので、同じ PC の他の mDNS 実装とポートを取り合わない。