bool CZeroconfBrowserOSX::doResolveService(CZeroconfBrowser::ZeroconfService &fr_service, double f_timeout) { bool ret = false; CFStringRef type = CFStringCreateWithCString(NULL, fr_service.GetType().c_str(), kCFStringEncodingUTF8); CFStringRef name = CFStringCreateWithCString(NULL, fr_service.GetName().c_str(), kCFStringEncodingUTF8); CFStringRef domain = CFStringCreateWithCString(NULL, fr_service.GetDomain().c_str(), kCFStringEncodingUTF8); CFNetServiceRef service = CFNetServiceCreate (NULL, domain, type, name, 0); if (CFNetServiceResolveWithTimeout(service, f_timeout, NULL) ) { std::string ip; int port = 0; ret = CopyFirstIPv4Address(service, ip, port); fr_service.SetIP(ip); fr_service.SetPort(port); //get txt-record list fr_service.SetTxtRecords(GetTxtRecords(service)); } CFRelease(type); CFRelease(name); CFRelease(domain); CFRelease(service); return ret; }
bool CZeroconfBrowserAndroid::doResolveService(CZeroconfBrowser::ZeroconfService& fr_service, double f_timeout) { jni::CJNINsdServiceInfo service; service.setServiceName(fr_service.GetName()); service.setServiceType(fr_service.GetType()); CZeroconfBrowserAndroidResolve resolver; m_manager.resolveService(service, resolver); if (!resolver.m_resolutionDone.WaitMSec(f_timeout * 1000)) { CLog::Log(LOGERROR, "ZeroconfBrowserAndroid: DNSServiceResolve Timeout error"); return false; } if (resolver.m_errorCode != -1) { CLog::Log(LOGERROR, "ZeroconfBrowserAndroid: DNSServiceResolve returned (error = %ld)", resolver.m_errorCode); return false; } fr_service.SetHostname(resolver.m_retServiceInfo.getHost().getHostName()); fr_service.SetIP(resolver.m_retServiceInfo.getHost().getHostAddress()); fr_service.SetPort(resolver.m_retServiceInfo.getPort()); CZeroconfBrowser::ZeroconfService::tTxtRecordMap recordMap; jni::CJNISet<jni::jhstring> txtKey = resolver.m_retServiceInfo.getAttributes().keySet(); jni::CJNIIterator<jni::jhstring> it = txtKey.iterator(); while (it.hasNext()) { jni::jhstring k = it.next(); jni::jhbyteArray v = resolver.m_retServiceInfo.getAttributes().get(k); std::string key = jni::jcast<std::string>(k); std::vector<char> vv = jni::jcast<std::vector<char>>(v); std::string value = std::string(vv.begin(), vv.end()); CLog::Log(LOGDEBUG, "ZeroconfBrowserAndroid: TXT record %s = %s (%d)", key.c_str(), value.c_str(), vv.size()); recordMap.insert(std::make_pair(key, value)); } fr_service.SetTxtRecords(recordMap); return (!fr_service.GetIP().empty()); }
bool CZeroconfBrowserMDNS::doResolveService(CZeroconfBrowser::ZeroconfService& fr_service, double f_timeout) { DNSServiceErrorType err; DNSServiceRef sdRef = NULL; //start resolving m_resolving_service = fr_service; m_resolved_event.Reset(); err = DNSServiceResolve(&sdRef, 0, kDNSServiceInterfaceIndexAny, fr_service.GetName(), fr_service.GetType(), fr_service.GetDomain(), ResolveCallback, this); if( err != kDNSServiceErr_NoError ) { if (sdRef) DNSServiceRefDeallocate(sdRef); CLog::Log(LOGERROR, "ZeroconfBrowserMDNS: DNSServiceResolve returned (error = %ld)", (int) err); return false; } err = DNSServiceProcessResult(sdRef); if (err != kDNSServiceErr_NoError) CLog::Log(LOGERROR, "ZeroconfBrowserMDNS::doResolveService DNSServiceProcessResult returned (error = %ld)", (int) err); #if defined(HAS_MDNS_EMBEDDED) // when using the embedded mdns service the call to DNSServiceProcessResult // above will not block until the resolving was finished - instead we have to // wait for resolve to return or timeout m_resolved_event.WaitMSec(f_timeout * 1000); #endif //HAS_MDNS_EMBEDDED fr_service = m_resolving_service; if (sdRef) DNSServiceRefDeallocate(sdRef); // resolve the hostname if (!fr_service.GetHostname().empty()) { CStdString strIP; // use mdns resolving m_addrinfo_event.Reset(); sdRef = NULL; err = DNSServiceGetAddrInfo(&sdRef, 0, kDNSServiceInterfaceIndexAny, kDNSServiceProtocol_IPv4, fr_service.GetHostname(), GetAddrInfoCallback, this); if (err != kDNSServiceErr_NoError) CLog::Log(LOGERROR, "ZeroconfBrowserMDNS: DNSServiceGetAddrInfo returned (error = %ld)", (int) err); err = DNSServiceProcessResult(sdRef); if (err != kDNSServiceErr_NoError) CLog::Log(LOGERROR, "ZeroconfBrowserMDNS::doResolveService DNSServiceProcessResult returned (error = %ld)", (int) err); #if defined(HAS_MDNS_EMBEDDED) // when using the embedded mdns service the call to DNSServiceProcessResult // above will not block until the resolving was finished - instead we have to // wait for resolve to return or timeout // give it 2 secs for resolving (resolving in mdns is cached and queued // in timeslices off 1 sec m_addrinfo_event.WaitMSec(2000); #endif //HAS_MDNS_EMBEDDED fr_service = m_resolving_service; if (sdRef) DNSServiceRefDeallocate(sdRef); // fall back to our resolver if (fr_service.GetIP().empty()) { CLog::Log(LOGWARNING, "ZeroconfBrowserMDNS: Could not resolve hostname %s falling back to CDNSNameCache", fr_service.GetHostname().c_str()); if (CDNSNameCache::Lookup(fr_service.GetHostname(), strIP)) fr_service.SetIP(strIP); else CLog::Log(LOGERROR, "ZeroconfBrowserMDNS: Could not resolve hostname %s", fr_service.GetHostname().c_str()); } } return (!fr_service.GetIP().empty()); }
bool CZeroconfBrowserWIN::doResolveService(CZeroconfBrowser::ZeroconfService& fr_service, double f_timeout) { DNSServiceErrorType err; DNSServiceRef sdRef = NULL; err = DNSServiceResolve(&sdRef, 0, kDNSServiceInterfaceIndexAny, fr_service.GetName(), fr_service.GetType(), fr_service.GetDomain(), ResolveCallback, &fr_service); if( err != kDNSServiceErr_NoError ) { if (sdRef) DNSServiceRefDeallocate(sdRef); CLog::Log(LOGERROR, "ZeroconfBrowserWIN: DNSServiceResolve returned (error = %ld)", (int) err); return false; } #if defined(__VIDONME_MEDIACENTER__) //don't block in DNSServiceProcessResult, timeout is 0. int dns_sd_fd = sdRef ? DNSServiceRefSockFD(sdRef) : -1; int nfds = dns_sd_fd + 1; fd_set readfds; struct timeval tv; int result; #if 0 while (!stopNow) { // 1. Set up the fd_set as usual here. // This example client has no file descriptors of its own, // but a real application would call FD_SET to add them to the set here FD_ZERO(&readfds); // 2. Add the fd for our client(s) to the fd_set if (sdRef) FD_SET(dns_sd_fd , &readfds); // 3. Set up the timeout. tv.tv_sec = 0; tv.tv_usec = 0; result = select(nfds, &readfds, (fd_set*)NULL, (fd_set*)NULL, &tv); if (result > 0) { DNSServiceErrorType err = kDNSServiceErr_NoError; if (sdRef && FD_ISSET(dns_sd_fd , &readfds)) err = DNSServiceProcessResult(sdRef); if (err) { fprintf(stderr, "DNSServiceProcessResult returned %d\n", err); stopNow = 1; } } else { printf("select() returned %d errno %d %s\n", result, errno, strerror(errno)); if (errno != EINTR) stopNow = 1; } } #else // 1. Set up the fd_set as usual here. // This example client has no file descriptors of its own, // but a real application would call FD_SET to add them to the set here FD_ZERO(&readfds); // 2. Add the fd for our client(s) to the fd_set if (sdRef) FD_SET(dns_sd_fd , &readfds); // 3. Set up the timeout. tv.tv_sec = 1; tv.tv_usec = 0; result = select(nfds, &readfds, (fd_set*)NULL, (fd_set*)NULL, &tv); if (result > 0) { DNSServiceErrorType err = kDNSServiceErr_NoError; if (sdRef && FD_ISSET(dns_sd_fd , &readfds)) err = DNSServiceProcessResult(sdRef); if (err) { fprintf(stderr, "DNSServiceProcessResult returned %d\n", err); } } else { printf("select() returned %d errno %d %s\n", result, errno, strerror(errno)); if (errno != EINTR) { //stopNow = 1; } } #endif #else err = DNSServiceProcessResult(sdRef); #endif//__VIDONME_MEDIACENTER__ if (err != kDNSServiceErr_NoError) CLog::Log(LOGERROR, "ZeroconfBrowserWIN::doResolveService DNSServiceProcessResult returned (error = %ld)", (int) err); if (sdRef) DNSServiceRefDeallocate(sdRef); return true; }
bool CZeroconfBrowserWIN::doResolveService(CZeroconfBrowser::ZeroconfService& fr_service, double f_timeout) { DNSServiceErrorType err; DNSServiceRef sdRef = NULL; err = DNSServiceResolve(&sdRef, 0, kDNSServiceInterfaceIndexAny, fr_service.GetName(), fr_service.GetType(), fr_service.GetDomain(), ResolveCallback, &fr_service); if( err != kDNSServiceErr_NoError ) { if (sdRef) DNSServiceRefDeallocate(sdRef); CLog::Log(LOGERROR, "ZeroconfBrowserWIN: DNSServiceResolve returned (error = %ld)", (int) err); return false; } err = DNSServiceProcessResult(sdRef); if (err != kDNSServiceErr_NoError) CLog::Log(LOGERROR, "ZeroconfBrowserWIN::doResolveService DNSServiceProcessResult returned (error = %ld)", (int) err); if (sdRef) DNSServiceRefDeallocate(sdRef); return true; }
bool CZeroconfBrowserMDNS::doResolveService(CZeroconfBrowser::ZeroconfService& fr_service, double f_timeout) { DNSServiceErrorType err; DNSServiceRef sdRef = NULL; //start resolving m_resolving_service = fr_service; m_resolved_event.Reset(); err = DNSServiceResolve(&sdRef, 0, kDNSServiceInterfaceIndexAny, fr_service.GetName(), fr_service.GetType(), fr_service.GetDomain(), ResolveCallback, this); if( err != kDNSServiceErr_NoError ) { if (sdRef) DNSServiceRefDeallocate(sdRef); CLog::Log(LOGERROR, "ZeroconfBrowserMDNS: DNSServiceResolve returned (error = %ld)", (int) err); return false; } err = DNSServiceProcessResult(sdRef); if (err != kDNSServiceErr_NoError) CLog::Log(LOGERROR, "ZeroconfBrowserMDNS::doResolveService DNSServiceProcessResult returned (error = %ld)", (int) err); if (sdRef) DNSServiceRefDeallocate(sdRef); #if defined(HAS_MDNS_EMBEDDED) // when using the embedded mdns service the call to DNSServiceProcessResult // above will not block until the resolving was finished - instead we have to // wait for resolve to return or timeout m_resolved_event.WaitMSec(f_timeout * 1000); #endif //HAS_MDNS_EMBEDDED fr_service = m_resolving_service; return (!fr_service.GetIP().empty()); }