使用Mavericks [NSSocketPortNameServer portForName:host:]
现在需要大约5秒来解析localhost。它曾经快得多,大约0.01秒。
我的代码与Apple's Introduction to Distributed Objects中的代码相同。
我曾经能够在不到0.1秒的时间内启动子进程并连接到它。 My file manager运行了几个子进程,并因此而在Mavericks上失效。该应用程序不是沙盒。
我不明白为什么[NSSocketPortNameServer portForName:host:]
需要这么久。也许我做错了什么。
有什么建议值得赞赏吗?
这需要大约0.1秒才能运行。
NSSocketPort* port = [[NSSocketPort alloc] init];
NSConnection* connection = [NSConnection connectionWithReceivePort:port sendPort:nil];
[[NSSocketPortNameServer sharedInstance] registerPort:port name:@"doug"];
小牛队需要5秒钟。
这曾经在Mountain Lion和Lion上花了大约0.1秒。
NSPort* port = [[NSSocketPortNameServer sharedInstance] portForName:@"doug" host:@"*"];
NSConnection* connection = [NSConnection connectionWithReceivePort:nil sendPort:port];
我也试过了nil
,就像这个[[NSSocketPortNameServer sharedInstance] portForName:name host:nil]
一样。它没有任何区别。
如果我使连接无效并尝试再次连接,则[[NSSocketPortNameServer sharedInstance] portForName:name host:nil]
也需要5秒钟。
当我使用scutil --dns
转储DNS配置时,我看到本地域有5秒超时。我怀疑这个超时在小牛队之前被设置为0秒。我不能要求所有用户重置此超时,因此我将继续调查如何处理Mavericks以避免此超时。
答案 0 :(得分:0)
终于解决了它。
我最终放弃了-portForName:host:
,而是通过命令行将端口号传递给子进程。
子进程以这种方式联系父进程:
int port = /* parent process' port number passed via command line */
NSSocketPort *port = [[NSSocketPort alloc] initRemoteWithTCPPort:port host:nil];
NSConnection* connection = [NSConnection connectionWithReceivePort:nil sendPort:port];
子进程通过命令行从父进程获取端口号。 父进程通过此类别查找自己的端口号。
@implementation NSSocketPort (ObtainPortNumber)
-(int)portNumber {
NSSocketNativeHandle sock = [self socket];
NSData *address = self.address;
if ([address length] != sizeof(struct sockaddr_in)) {
NSLog(@"NSSocketPort (ObtainPortNumber) - Mismatch size of address vs size of sockaddr_in.");
return -1;
}
struct sockaddr_in addr = *((struct sockaddr_in*)[address bytes]);
socklen_t len = sizeof(addr);
if (getsockname(sock, (struct sockaddr *)&addr, &len) == -1) {
NSLog(@"NSSocketPort (ObtainPortNumber) - getsockname failed.");
return -1;
}
int portNumber = ntohs(addr.sin_port);
return portNumber;
}
@end