2010-07-30 46 views
2

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

苹果网站说

为了提高效率,执行许多并发操作的客户可能要使用而不必为每个独立操作一个单独的连接与后台守护一个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

用于浏览和解析的服务参考可能不幸不被共享。请参阅Bonjour documentation中关于kDNSServiceFlagsShareConnection-flag的注释。既然你只浏览两次,我会让他们有单独的服务参考。

因此,DNSServiceBrowse()DNSServiceResolve()都需要一个未分配的service-ref作为第一个参数。

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

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