2013-10-11 12 views
1

DNS-SD를 통해 검색 할 수있는 LAN상의 장치에서 서버 응용 프로그램을 실행하고 있습니다 (예 : Zeroconf/Bonjour/Avahi). LAN상의 클라이언트 장치는이 서버에 연결됩니다. 내 응용 프로그램에 연결하는 데 사용되는 응용 프로그램을 제어 할 수는 없지만 DNS-SD 및 mDNS를 사용하여 서버를 검색하고 연결할 가능성이 높습니다. C 또는 C++에서 IP 주소 만 주어진 이러한 클라이언트 장치를 식별하는 링크 로컬 도메인 이름을 검색하려면 어떻게합니까?
"좋아요".local의이 도메인에서 이름의 IPv4에 해당하기 때문에 "는 IPv4와 IPv6 역 매핑 도메인도 ... 링크 로컬로 정의 된 링크 로컬 : Section 4. Reverse Address Mapping -IP 주소에서 링크 로컬 도메인 이름 가져 오기 (예 : 멀티 캐스트 DNS 및 DNS-SD를 사용한 DNS 역방향 조회)

따르면 RFC 6762 Multicast DNS합니다. 주소와 관련해서는 로컬 링크가 해당 이름과 관련된 정보를 찾는 가장 좋은 장소라는 것은 논리적입니다. "

이론적으로 IP 주소로 링크 로컬 도메인 이름을 조회 할 수 있어야합니다. 아무도 어떻게 알 수 있습니까? 어쩌면 올바른 장소를보고 있지는 않지만 Bonjour 문서 내에서 API 호출이 표시되지 않습니다.

답변

1

Apple의 Bonjour Dev 메일 링리스트를 통해이 질문에 대한 답변을 얻었습니다.

as 퀸 "에스키모!"

static void DNSCallback(
    DNSServiceRef      sdRef, 
    DNSServiceFlags      flags, 
    uint32_t       interfaceIndex, 
    DNSServiceErrorType     errorCode, 
    const char       *fullname, 
    uint16_t       rrtype, 
    uint16_t       rrclass, 
    uint16_t       rdlen, 
    const void       *rdata, 
    uint32_t       ttl, 
    void        *context 
) 
{ 
    const uint8_t *  cursor; 

    fprintf(stderr, "DNSCallback\n"); 
    assert(rrtype == kDNSServiceType_PTR); 
    assert(rrclass == kDNSServiceClass_IN); 
    cursor = (const uint8_t *) rdata; 
    while (*cursor != 0) { 
     fprintf(stderr, "%.*s.", (int) *cursor, cursor + 1); 
     cursor += *cursor + 1; 
    } 
    fprintf(stderr, "\n"); 
} 

static void SocketCallBack(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) 
{ 
    DNSServiceErrorType err; 

    fprintf(stderr, "SocketCallBack\n"); 

    err = DNSServiceProcessResult(((AppDelegate *) info)->sdRef); 
    fprintf(stderr, "err = %d\n", (int) err); 
} 

- (IBAction)testAction:(id)sender 
{ 
    DNSServiceErrorType err; 
    int     sock; 
    CFSocketRef   cfSock; 

    fprintf(stderr, "-[AppDelegate testAction:]\n"); 

    assert(self->sdRef == NULL); 

    err = DNSServiceQueryRecord(
     &self->sdRef, 
     kDNSServiceFlagsForceMulticast, 
     0, 
     "9.40.0.10.in-addr.arpa.", 
     kDNSServiceType_PTR, 
     kDNSServiceClass_IN, 
     DNSCallback, 
     self 
    ); 
    fprintf(stderr, "err = %d\n", (int) err); 

    sock = DNSServiceRefSockFD(self->sdRef); 
    fprintf(stderr, "sock = %d\n", sock); 

    CFSocketContext context = { 0, self, NULL, NULL, NULL }; 

    cfSock = CFSocketCreateWithNative(NULL, sock, kCFSocketReadCallBack, SocketCallBack, &context); 
    assert(cfSock != NULL); 

    CFRunLoopSourceRef rls; 
    rls = CFSocketCreateRunLoopSource(NULL, cfSock, 0); 
    assert(rls != NULL); 

    CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode); 
} 

이 예는 IP 주소 10.0.40.9에 대한 링크 로컬 호스트 이름을 찾을 수 있습니다 :, 여기 당신이 그것을 할 수있는 방법입니다. IP 주소는 역순으로 삽입됩니다.