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,後面通信就比較好辦了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章