我正在使用Bonjour的dns-sd api建立一个客户端。我注意到有一个名为kDNSServiceFlagsShareConnection的标志,它用于共享一个DNSServiceRef的连接。
Apple网站说
为了提高效率,执行许多并发操作的客户端可能希望将单个Unix域套接字连接与后台守护程序一起使用,而不是为每个独立操作使用单独的连接。要使用此模式,客户端首先调用DNSServiceCreateConnection(& MainRef)来初始化主DNSServiceRef。对于要共享同一连接的每个后续操作,客户端复制MainRef,然后传递该副本的地址,设置ShareConnection标志以告知库该DNSServiceRef不是典型的未初始化的DNSServiceRef;它是现有DNSServiceRef的副本,其重新连接信息应该被重用。
甚至有一个示例显示如何使用该标志。我遇到的问题是当我运行程序时,每当我调用带有标志的函数时,它就像等待某事一样。这是代码:
DNSServiceErrorType error;
DNSServiceRef MainRef, BrowseRef;
error = DNSServiceCreateConnection(&MainRef);
BrowseRef = MainRef;
//I'm omitting when I check for errors
error = DNSServiceBrowse(&MainRef, kDNSServiceFlagsShareConnection, 0, "_http._tcp", "local", browse_reply, NULL);
// After this call the program stays waiting for I don't know what
//I'm omitting when I check for errors
error = DNSServiceBrowse(&BrowseRef, kDNSServiceFlagsShareConnection, 0, "_http._tcp", "local", browse_reply, NULL);
//I'm omitting when i check for errors
DNSServiceRefDeallocate(BrowseRef); // Terminate the browse operation
DNSServiceRefDeallocate(MainRef); // Terminate the shared connection
有什么想法吗?想法?建议?
答案 0 :(得分:1)
由于答案存在冲突,因此我挖出了源代码-由我注释。
// If sharing...
if (flags & kDNSServiceFlagsShareConnection)
{
// There must be something to share (can't use this on the first call)
if (!*ref)
{
return kDNSServiceErr_BadParam;
}
// Ref must look valid (specifically, ref->fd)
if (!DNSServiceRefValid(*ref) ||
// Most operations cannot be shared.
((*ref)->op != connection_request &&
(*ref)->op != connection_delegate_request) ||
// When sharing, pass the ref from the original call.
(*ref)->primary)
{
return kDNSServiceErr_BadReference;
}
primary
字段在其他地方进行了解释:
// When using kDNSServiceFlagsShareConnection, there is one primary _DNSServiceOp_t, and zero or more subordinates
// For the primary, the 'next' field points to the first subordinate, and its 'next' field points to the next, and so on.
// For the primary, the 'primary' field is NULL; for subordinates the 'primary' field points back to the associated primary
问题所在是DNSServiceBrowse
映射到ref->op==browse_request
,从而导致kDNSServiceErr_BadReference
。
kDNSServiceFlagsShareConnection
似乎已实现一半,因为我也看到了它可以工作的情况-通过追溯无效的源来找到此源。
答案 1 :(得分:0)
不幸的是,不能共享的浏览和解析服务参考。请参阅Bonjour documentation中有关kDNSServiceFlagsShareConnection
- 标记的评论。由于您只浏览了两次,我会让它们分别使用单独的service-ref。
因此,DNSServiceBrowse()
和DNSServiceResolve()
都需要将未分配的service-ref作为第一个参数。
我无法解释为什么你的程序会窒息。示例中的第一个DNSServiceBrowse()
调用应立即返回错误代码。
答案 2 :(得分:0)
虽然是一个老问题,但它应该帮助人们现在四处寻找答案。
vidtige的回答不正确,如果您通过了“kDNSServiceFlagsShareConnection”,则可以为任何操作共享。标志以及参数。以下示例 -
m_dnsrefsearch = m_dnsservice;
DNSServiceErrorType mdnserr = DNSServiceBrowse(&m_dnsrefsearch,kDNSServiceFlagsShareConnection,0,
"_workstation._tcp",NULL,
DNSServiceBrowseReplyCallback,NULL);
参考 - http://osxr.org/android/source/external/mdnsresponder/mDNSShared/dns_sd.h#0267