gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:27:29 30 4
gpt4 key购买 nike

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

根据 RFC 6762 Multicast DNS - Section 4. Reverse Address Mapping :
“与“.local.”一样,IPv4 和 IPv6 反向映射域也被定义为链路本地...由于该域下的名称对应于 IPv4 链路本地地址,因此本地链路是合乎逻辑的找到与这些名称有关的信息的最佳位置。”

所以理论上,应该可以通过IP地址查找链路本地域名。有谁知道怎么做?也许我没有在正确的地方寻找,但我在 Bonjour 文档中没有看到对此的 API 调用。

最佳答案

我最终通过 Apple 的 Bonjour Dev 邮件列表得到了这个问题的答案。

根据 Quinn “爱斯基摩人!”,您可以按照以下方式做到这一点:

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地址倒序插入。

关于bonjour - 从 IP 地址获取链接本地域名​​(即使用多播 DNS 和 DNS-SD 进行反向 DNS 查找),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19309329/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com