代码之家  ›  专栏  ›  技术社区  ›  Jeremy Friesner

为什么这个avahi客户机代码不能为我的Linux机器添加一个cname别名?

  •  2
  • Jeremy Friesner  · 技术社区  · 15 年前

    我正在尝试编写一个小程序,将MDNS CNAME别名添加到我的Linux设备中,这样就可以通过多个“something.local.”域名访问它。

    此程序的预期功能与 avahi-aliases Python script 但是为了避免Python依赖性,我尝试用C++来实现它。

    我的代码(目前)基于客户端发布服务.c示例,该示例包含在avahi源发行版中。当我以不变的方式运行这个示例时,它会按预期工作:特别是,我看到“MegaPrinter”出现在我的Mac电脑上的Bonjour浏览器中,等等。

    我的下一步是修改示例代码以添加CNAME记录,而不是添加服务。因此,我ifdef出avahi_entry_group_add_service()调用并将其放入:

     const int TTL = 60;
    
     char rdata[] = "\0msli-10135114\0local";   // "msli10135114.local." is the device's normal FQDN, which I want to make aliases to
     rdata[0]   = 13;
     rdata[14]  = 5;
    
     printf("rdata=[%s] _moduleName=[%s]\n", rdata, _moduleName);
     printf("add_record: %s\n", avahi_strerror(avahi_entry_group_add_record (group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, (AvahiPublishFlags)0, "TestX", 0x01, 0x10, 120, "\5booya", 6)));
    
     if ((ret = avahi_entry_group_add_record(
        group,                 //AvahiEntryGroup *group,
        AVAHI_IF_UNSPEC,       //AvahiIfIndex interface,
        AVAHI_PROTO_UNSPEC,    //AvahiProtocol protocol,
        (AvahiPublishFlags)0,  //AvahiPublishFlags flags,
        _moduleName,           //const char *name,
        AVAHI_DNS_CLASS_IN,    //uint16_t clazz,
        AVAHI_DNS_TYPE_CNAME,  //uint16_t type,
        TTL,                   //uint32_t ttl,
        rdata,                 //const void *rdata,
        sizeof(rdata)          //size_t size
        )) < 0)
     {
        if (ret == AVAHI_ERR_COLLISION) goto collision;
        fprintf(stderr, "Failed to add module record: %s\n", avahi_strerror(ret));
        goto fail;
     }
    

    …但它不起作用;特别是,运行例程只会给我这个输出:

    msli-10135114local] _moduleName=[Wild-Tracks-1]
    add_record: Not supported 
    Failed to add module record: Not supported
    

    奇怪的是,我自己对avahi_entry_group_add_record()的调用不仅失败,代码avahi_err_不受支持,而且我的丢弃测试调用(在printf(“add_record”)中)也失败,错误代码相同。但是这个调用是从avahi附带的avahi client/client test.c文件中逐字复制的,所以它看起来应该是一个有效的调用。

    有人能提出为什么这些电话可能会失败,或者我在这里做错了什么吗?

    如果有帮助,测试的完整源代码是 here .

    1 回复  |  直到 15 年前
        1
  •  6
  •   Jeremy Friesner    15 年前

    我终于弄明白了…问题是,avahi_entry_group_add_记录的(avahipublishFlags)参数需要包括avahi_publish_use_多播位,而不仅仅是零。奇怪的是,我作为例子使用的python脚本没有包含这一点。

    here 以防有人感兴趣。

    推荐文章