前段时间因为项目需要,开始研究Bonjour,下面先来介绍下Bonjour吧。
1.什么是Bonjour?
Bonjour这个词来源于法语,是“你好”的意思。在这里它是指由Apple推出的零配置网络协议,遵从这个协议的设备可以在局域网内发现彼此,设备之间就可以像人一样打招呼发现对方。
2.bonjour简单工作流程
1)发布服务
在同一局域网中,服务端通过DNSServiceRegister函数来注册服务。
DNSServiceErrorType DNSSD_API DNSServiceRegister
(
DNSServiceRef *sdRef ,
DNSServiceFlags flags,
uint32_t interfaceIndex,
const char *name, /* may be NULL */
const char *regtype,
const char *domain, /* may be NULL */
const char *host, /* may be NULL */
uint16_t port, /* In network byte order */
uint16_t txtLen,
const void *txtRecord, /* may be NULL */
DNSServiceRegisterReply callBack, /* may be NULL */
void *context /* may be NULL */
);
重点提一下:
sdRef 为服务索引,如果注册服务成功则初始化这个索引。通过DNSServiceRefDeallocate()来释放。
regtype 注册的服务类型。
port 端口号必须是要网络字节序的,笔者就是因为当初就是没有使用网络字节序的端口号导致无法和其他设备连接。
callBack 回调函数,
context 上下文,
返回值 kDNSServiceErr_NoError 表示成功,否则返回错误码。
2)发现服务
客户端通过DNSServiceBrowse函数查看发布服务的设备名称。
DNSServiceErrorType DNSSD_API DNSServiceBrowse
(
DNSServiceRef *sdRef,
DNSServiceFlags flags,
uint32_t interfaceIndex,
const char *regtype,
const char *domain, /* may be NULL */
DNSServiceBrowseReply callBack,
void *context /* may be NULL */
);
3)连接服务
选择想要连接的设备进行通讯。
3. 关于后台服务守护进程mDNSResponder
由于笔者使用的是windows系统,在安装完Bonjour的SDK后,就会有以一个mDNSResponder后台守护进程。这个东西对稍微有点洁癖的我来说,实在是太恶心了。写了个demo想给同学测试下,不断不行啊,一定要安装这个服务才行。。。。。。难以让人接受。。。。。。
一直在想这个东西可不可以直接弄成动态链接库啊,这样的话,使用bonjour协议的程序就不用安装这个服务了。一直没成功。如果有读者有好的建议,希望可以一起研究。