我有一个服务器应用程序运行在局域网上的一个设备上,它可以通过DNS-SD (即Zeroconf/Bonjour/Avahi)发现。客户端设备,也在局域网上,连接到此服务器。我无法控制用于连接到我的服务器应用程序的应用程序,但我知道它们可能使用DNS-SD和mDNS来发现并连接到服务器。我如何检索链接本地域名识别这些客户端设备只给出他们的IP地址在C或C++?
与".local.“一样,IPv4和IPv6反向映射域也被定义为链接本地.由于该域下的名称对应于IPv4链接-本地地址,因此本地链接是查找与这些名称有关的信息的最佳位置。
因此,从理论上讲,应该可以通过IP地址查找链接本地域名.有人知道怎么做吗?也许我找的不是对的地方,但我没有在Bonjour文档中看到对此的API调用。
发布于 2013-10-14 03:06:03
最后,我通过苹果的Bonjour Dev邮件列表得到了这个问题的答案。
根据奎因的“爱斯基摩人”,你可以这样做:
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地址按反向顺序插入。
https://stackoverflow.com/questions/19309329
复制相似问题