2

我正在使用 Bonjour 的 dns-sd api 构建一个客户端。我注意到有一个名为 kDNSServiceFlagsShareConnection 的标志,它用于共享一个 DNSServiceRef 的连接。

苹果网站说

为了提高效率,执行许多并发操作的客户端可能希望将单个 Unix Domain Socket 连接与后台守护程序一起使用,而不是为每个独立操作使用单独的连接。要使用这种模式,客户端首先调用 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

有任何想法吗?想法?建议?

4

3 回答 3

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是半实现的,因为我也看到了它工作的案例——这个来源是通过在它不起作用时追溯找到的。

于 2018-09-19T13:31:11.663 回答
0

遗憾的是,用于浏览和解析的服务引用可能不会被共享。请参阅Bonjour 文档中有关kDNSServiceFlagsShareConnection-flag 的注释。由于您只浏览两次,我只会让他们有单独的服务参考。

所以两者都DNSServiceBrowse()需要DNSServiceResolve()一个未分配的服务引用作为第一个参数。

我无法解释为什么你的程序会窒息。您示例中的第一个DNSServiceBrowse()调用应立即返回错误代码。

于 2011-03-30T13:36:19.380 回答
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

于 2015-07-01T05:59:35.177 回答