首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从IP地址获取链接-本地域名(即使用多播DNS和DNS -SD反向DNS查找)

问从IP地址获取链接-本地域名(即使用多播DNS和DNS -SD反向DNS查找)
EN

Stack Overflow用户
提问于 2013-10-11 02:31:39
回答 1查看 1.5K关注 0票数 3

我有一个服务器应用程序运行在局域网上的一个设备上,它可以通过DNS-SD (即Zeroconf/Bonjour/Avahi)发现。客户端设备,也在局域网上,连接到此服务器。我无法控制用于连接到我的服务器应用程序的应用程序,但我知道它们可能使用DNS-SD和mDNS来发现并连接到服务器。我如何检索链接本地域名识别这些客户端设备只给出他们的IP地址在C或C++?

根据RFC 6762多播DNS - 第4节.反向地址映射

与".local.“一样,IPv4和IPv6反向映射域也被定义为链接本地.由于该域下的名称对应于IPv4链接-本地地址,因此本地链接是查找与这些名称有关的信息的最佳位置。

因此,从理论上讲,应该可以通过IP地址查找链接本地域名.有人知道怎么做吗?也许我找的不是对的地方,但我没有在Bonjour文档中看到对此的API调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-14 03:06:03

最后,我通过苹果的Bonjour Dev邮件列表得到了这个问题的答案。

根据奎因的“爱斯基摩人”,你可以这样做:

代码语言:javascript
复制
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地址按反向顺序插入。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19309329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档