문제

나는 휴대폰뿐만 아니라 컴퓨터에서도 실행될 소프트웨어를 작성하고 있습니다.

이 서비스는 통신을 위해 HTTP API를 사용하며 Zeroconf를 사용하여 로컬 네트워크를 통해 게시됩니다.

처음에는 다음을 사용하여 서비스를 게시했습니다. _http._tcp. 서비스 유형으로 지정했지만 내 NAS와 음악 수신기(!) 모두가 정확한 서비스 유형으로 스스로를 방송한다는 사실을 금방 발견했습니다.

이제 내 서비스와 HTTP를 사용하는 다른 서비스를 구별하는 방법에 대한 의문이 생깁니다.

대안

다른 서비스 유형 사용

이는 확실히 가장 쉬운 방법이며 (거의) 다른 서비스가 선택되지 않도록 보장합니다.

그러나 애플에 따르면1 새로운 서비스 ~해야 한다 IANA에 등록되어야 합니다.이는 분명히 필수는 아니지만 권장하는 내용을 보면 잘못된 방법인 것처럼 느껴집니다.

TXT 레코드 사용

사과2 TXT 레코드를 다음과 같이 설명합니다.

서비스가 등록되면 세 가지 관련 DNS 레코드가 생성됩니다.서비스(SRV) 레코드, 포인터(PTR) 레코드 및 텍스트(TXT) 레코드입니다.TXT 레코드에는 서비스를 해결하거나 사용하는 데 필요한 추가 데이터가 포함되어 있지만 비어 있는 경우도 많습니다.

확실히 이것이 올바른 방법일 수 있다고 생각되지만 여전히 확실하지 않으며 필드에 포함되어야 하는 내용에 대한 설명을 찾기가 어렵습니다.

내 첫 번째는 다음과 같은 것을 넣는 것입니다. <service_name>-<version> 그런 다음 실제로 어떤 서비스인지 확인하기 위해 구문 분석됩니다.

내 NAS는 모델과 버전 번호를 식별하는 데 이를 사용하는 것 같습니다.

서비스에 얘기해 보세요

서비스를 찾은 후에는 언제든지 다음 작업을 수행할 수 있습니다. HEAD 알려진 엔드포인트에서 요청하고 서비스에서 설정한 알려진 헤더를 찾습니다.

이는 상당히 느린 접근 방식처럼 느껴지며, HEAD 내 수신자에게 요청하면 됩니다.


분명히 말씀드리자면, 이 질문은 특정 언어나 프레임워크와는 아무런 관련이 없으며, zeroconf의 개념에 관한 것입니다.

몇 가지 코드를 보여줄 수 있지만 그것이 어떻게 도움이 될지 모르겠습니다.

도움이 되었습니까?

해결책

첫째, 귀하가 광고하는 서비스가 실제로 자격을 충족합니까? _http 에 의해 정의된 대로 RFC 2782.특히 전송을 위해 HTTP를 사용하는 것뿐만 아니라 다음과 같은 기능도 수행합니다.

  • "일반적인" 웹 브라우저 클라이언트 소프트웨어로 표시될 수 있습니다.
  • 주로 인간 사용자가 보도록 고안되었습니다.

아니요인 경우 고유한 서비스 유형을 등록하세요(HTTP를 전송으로 사용하지만 해당 자격을 충족하지 않는 몇 가지 다른 서비스가 있으므로 -http 서비스 이름의 접미사는 다음을 참조하세요. pgpkey-http, senteo-http, xul-http).

그렇다면 RFC에 대한 해석이 얼마나 엄격한지에 따라 몇 가지 방법이 있습니다.가장 덜 엄격한 것은 단지 TXT 질문에 이미 언급한 대로 기록하세요.iTunes는 다음을 통해 자신을 등록합니다. TXT 형식으로 기록 iTSh Version=196618.

좀 더 엄격하다고 생각한다면 RFC는 다음과 같이 명시적으로만 명시합니다. u=, p= 그리고 path= HTTP에 대한 TXT 레코드가 존재합니다.아마도 누군가가 이것에 대해 이야기할 수 있지만, 이미 존재하는 항목에 TXT 레코드를 추가하는 것이 눈살을 찌푸리는지 여부에 대한 많은 논의를 본 적이 없습니다.따라서 다른 방법은 알고리즘 인스턴스 이름을 사용하는 것입니다.예를 들어 장치 이름에 접미사 "-NicklasAService"를 추가합니다.로컬 네트워크에 고유한 이름을 부여하되 접미사만 검색하면 PTR 레코드에서 서비스를 쉽게 선택할 수 있도록 만들기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top