我试图在跨平台的C应用程序(Linux / Windows)中使用dns_sd-Librarys和Apple的Bonjour守护程序来查找网络上该应用程序的其他实例。尽管它可以在具有Avahi和avahi-compat-libdns_sd的Linux上完美运行,但我无法使其在具有Bonjour的Windows上运行。不幸的是,Windows应用程序仅限于32位mingw32工具链(gcc 4.9.2)。
它编译并链接没有错误,但是对dnssd-API的每次调用均失败,错误代码为-65563 背景守护程序未运行。
Bonjour守护程序正在运行(我仔细检查了Windows服务和mDNSResponder.exe进程),甚至命令行上的dns-sd.exe
都可以正常运行。我正在使用Windows 7 x64和Bonjour / Bonjour SDK 3.0.0.10。
这是一个最小的无法正常运行的示例程序:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "dns_sd.h"
#include <windows.h>
static DNSSD_API void DNSServiceBrowseCallback(
DNSServiceRef sdRef,
DNSServiceFlags flags,
uint32_t interfaceIndex,
DNSServiceErrorType errorCode,
const char *serviceName,
const char *regtype,
const char *replyDomain,
void *context)
{
printf("%s service %s.%s%s (error code %i)\n",
(flags & kDNSServiceFlagsAdd) ? "new" : "vanished",
serviceName,
regtype,
replyDomain,
errorCode);
}
int main( int argc, char** argv ) {
DNSServiceRef sdRef = NULL;
DNSServiceErrorType res = DNSServiceBrowse(&sdRef, 0, 0, "_ipp._tcp", NULL,
&DNSServiceBrowseCallback, sdRef);
if (res != kDNSServiceErr_NoError) {
printf("Could not start network discovery: Errorcode %i\n", res);
return 1;
}
// Enter loop to receive results
// [...]
return 0;
}
使用
进行编译gcc.exe -g -Wall -std=c99 -DWINVER=0x0501 dnssd-test.c -ldnssd -o dnssd-test.exe
触发链接器警告警告:def文件末尾的.drectve损坏,但会创建有效的可执行文件。执行它会导致上述错误代码(无法启动网络发现:错误代码-65563 ),并且不会初始化sdRef
,因此,尽管服务器在网络上被宣布,但回调函数永远不会被调用。
我已经尝试过旧版本的Bonjour和Bonjour SDK,但没有成功。