Совместное использование DNSServiceRef с использованием kDNSServiceFlagsShareConnection останавливает мою программу - PullRequest
2 голосов
/ 30 июля 2010

Я создаю клиент, используя dns-sd api из Bonjour.Я заметил, что есть флаг kDNSServiceFlagsShareConnection, который используется для совместного использования соединения одного DNSServiceRef.

Сайт Apple сообщает:

Для эффективности клиенты, которые выполняют много одновременных операций, могут захотеть использовать одно соединение 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

Есть идеи?мысли?предложение

Ответы [ 3 ]

1 голос
/ 19 сентября 2018

Поскольку есть противоречивые ответы, я выкопал источник - аннотации мной.

// 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 реализован наполовину, потому что я также видел случаи, когда он работает - этот источник былнайдено путем отслеживания, когда это не сработало.

0 голосов
/ 01 июля 2015

Хотя это старый вопрос, но он должен помочь людям сейчас искать ответы.

Ответ по 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

0 голосов
/ 30 марта 2011

Сервисные ссылки для просмотра и разрешения могут, к сожалению, не передаваться .См. Комментарии в документации Bonjour для флага kDNSServiceFlagsShareConnection.Поскольку вы просматриваете только два раза, я бы просто позволил им иметь отдельные service-refs.

Так что и DNSServiceBrowse(), и DNSServiceResolve() требуют нераспределенного service-ref в качестве первого параметра.не объясните, почему ваша программа задыхается, хотя.Первый вызов DNSServiceBrowse() в вашем примере должен немедленно вернуться с кодом ошибки.

...