【问题标题】:NSNetService doesn't contain any addressesNSNetService 不包含任何地址
【发布时间】:2019-03-23 19:33:09
【问题描述】:

我在 Mac 应用程序中托管服务并与 iOS 应用程序连接。虽然 iOS 应用会找到该服务,但该服务不包含任何地址,因此我无法连接套接字。

这是我在 Mac 上的托管代码:

- (void)start {

    queue = dispatch_queue_create("KeyboardServer", DISPATCH_QUEUE_CONCURRENT);

    socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:queue];

    NSError *error = nil;

    if ([socket acceptOnPort:0 error:&error]) {

        service = [[NSNetService alloc] initWithDomain:@"local." type:@"_probonjore._tcp." name:@"TestServer" port:[socket localPort]];

        service.delegate = self;

        [service publish];

    } else {
        NSLog(@"Unable to create server");
    }
}

这是iOS上的连接代码:

- (BOOL)connectToServer:(NSNetService *)service {

    NSArray *addresses = service.addresses;

    socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:queue];

    for (NSData *address in addresses) {

        NSError *error;

        if ([socket connectToAddress:address error:&error]) {
            NSLog(@"Socket connected!");

            return true;
        }
    }

    return false;
}

问题是,service.addresses 始终为空,循环立即退出。

【问题讨论】:

  • 有什么办法让它自动选择一个端口,还是我只需要随机选择一个并希望它不会被占用?
  • 我刚刚检查了一下,如果你传递了 0,套接字库 (GCDAsyncSocket) 会自动选择一个端口。上次我运行它时,该服务正在端口 51417 上发布。

标签: ios objective-c macos bonjour nsnetservice


【解决方案1】:

对于任何好奇的人,我四处搜索并找到了解决方案。

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing

函数,你需要:

  • 将服务添加到数组中,以在对象超出范围后立即停止释放
  • 在对象上设置委托,以便您可以响应其地址解析
  • 调用函数使其解析

看起来像这样:

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing {

    NSLog(@"Found Service %@", [service name]);

    [services addObject:service];

    [service setDelegate:self];

    [service resolveWithTimeout:5.0f];
}

然后你想实现

- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict

- (void)netServiceDidResolveAddress:(NSNetService *)service

捕获地址解析或未解析的时间。

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多