Технические вопросы и ответы QA1513

Распространение службы Bonjour на определенный набор сетевых интерфейсов.

Q: Я хочу использовать Добрый день для распространения моих служб, но я только хочу сделать так на определенном наборе сетевых интерфейсов. Действительно ли это возможно?

A: Я хочу использовать Добрый день для распространения моих служб, но я только хочу сделать так на определенном наборе сетевых интерфейсов. Действительно ли это возможно?

Да. Однако Вы НЕ будете в состоянии использовать NSNetServices и CFNetServices APIs, чтобы сделать это. Необходимо будет использовать DNSServiceDiscovery основанный на сокете API.

Можно зарегистрировать службу путем издавания приказа к DNSServiceRegister(), обращение пристального внимания на третий параметр, указывающий интерфейсный индекс. Определение, которое интерфейсный индекс отображает на определенное имя интерфейса, может быть сделано путем вызова if_nametoindex(). Посмотрите ниже для примера:

  Функция перечисления 1 В качестве примера, регистрирующая службу на единственный интерфейс.

static int doBonjourRegisterOnSingleInterface(
    char * interface_name,          // e.g., "en0", "en1", etc.
    DNSServiceRef * ssr,
    DNSServiceRegisterReply callBack
)
{
    int err = 0;

    DNSServiceFlags flags   = kDNSServiceFlagsDefault;
    uint32_t int_index      = 0;
    const char *name        = "Clarus";
    const char *regtype     = "_http._tcp";
    const char *domain      = NULL; // default domain
    const char *host        = NULL; // default host
    uint16_t port           = 9999;
    uint16_t txtLen         = 5;
    const char txtRecord[] = "\x04Moof";

    // Resolve the index of the specified interface.
    int_index = if_nametoindex(interface_name);

    if(int_index != 0) {

          err = DNSServiceRegister(
                            ssr,
                            flags,
                            int_index,
                            name,       /* may be NULL */
                            regType,
                            domain,     /* may be NULL */
                            host,       /* may be NULL */
                            htons(port),
                            txtLen,
                            txtRecord,
                            callback,   /* may be NULL */
                            NULL        /* may be NULL */
          );

     } else {
          // Desired interface name could not be resolved.
          err = -1;
     }

    return err;
}


История версии документа


ДатаПримечания
12.02.2007

Новый документ, объясняющий, как зарегистрировать службу Bonjour только на определенный набор сетевых интерфейсов.