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