IOS上扫描发现mDns服务实现方法

IOS上类似的技术叫bonjour,其实核心也是mdns技术。官方的介绍在这添加链接描述
下面这篇博客对使用的介绍也很详细
https://www.jianshu.com/p/94c5848894e1
通俗的说,就是有人在局域网问:有叫xxx的吗?然后xxx就回复说:我就是,我微信号是xxxxxx(IP+PORT等信息)。

IOS上实现局域网扫描mDns核心是用的NetServiceBrowser对象,只要生成一个NetServiceBrowser,设置好delegete,然后去对应的方法中做操作即可。

官方的使用说明

比如作为客户端想扫描的局域网的服务是这个:

_testmdns._tcp.local.

那么可以采用下面的代码:
初始化:

	self.serviceBrowser = [[NSNetServiceBrowser alloc] init];
    [self.serviceBrowser setDelegate:self];
    [self.serviceBrowser searchForServicesOfType:@"_testmdns._tcp." inDomain:@"local."];

比较重要的两个方法:
监听是否发现了server:

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
           didFindService:(NSNetService *)aNetService
               moreComing:(BOOL)moreComing
{
	//设置代理,方便后续解析server的各种参数
    aNetService.delegate = self;
    NSLog(@"--didFindService---service name = %@", aNetService.name);
}

扫描到的对象是NSNetService,解析扫描到的server的参数:

#pragma mark NSNetServiceDelegate
- (void)netServiceDidResolveAddress:(NSNetService *)service {
    
    NSLog(@"----ResolveAddress----");
    for (NSData* data in [service addresses]) {
        char addressBuffer[100];
        struct sockaddr_in* socketAddress = (struct sockaddr_in*) [data bytes];
        int sockFamily = socketAddress->sin_family;
        if (sockFamily == AF_INET) {
            const char* addressStr = inet_ntop(sockFamily,
                                               &(socketAddress->sin_addr), addressBuffer,
                                               sizeof(addressBuffer));
            
            int port = ntohs(socketAddress->sin_port);
            
            [self._spinner stopAnimating];
            
            self.mdnsIp=[NSString stringWithFormat:@"%s",addressStr];
            self.mdnsport=[NSString stringWithFormat:@"%d",port];
            
            NSLog(@"Found service at %s:%d", addressStr, port);
            UIAlertView *mdnsAlert = [[UIAlertView alloc]
                                  initWithTitle:@"mDns扫描"
                                      message:[NSString stringWithFormat:@"name:%@ iP:%s:%d",service.name,addressStr,port]
                                  delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
            
            [mdnsAlert show];
        }
    }
    
}

解析除了IP和PORT,后面通信就比较好办了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值