我正在尝试编写一个小程序,将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
.