module

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

find_port(packet : Bytes, instance : String = INSTANCE) : Int32 | Nil

応答から instance の SRV レコードを探し、そのポートを返す。無ければ nil を返す。

同じ種別には VRChat なども応えるため、ポートはインスタンス名で選ぶ。 SRV は回答にも追加にも置かれうるので、問い合わせ以外の全レコードを見る。 応答の形が崩れていても例外は出さず、見つからなかったものとして扱う。

Source
query

_oscjson._tcp.local の PTR を問う 1 問だけのパケット。

一時ポートから送るため、応答はユニキャストで返ってくる。 5353 へ bind せずに済むので、同じ PC の他の mDNS 実装とポートを取り合わない。

Source

Nested types