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,后面通信就比较好办了。