对于小牛,[NSSocketPortNameServer portForName:host:]现在需要大约5秒的时间来解析本地主机。它过去要快得多,大约0.01秒。
我的代码与Apple对分布式对象的介绍中的代码相同。
我过去能够启动一个子进程,并在不到0.1秒内连接到它。我的档案经理运行多个子进程,因此目前在小牛上已经失效。该应用程序没有沙箱。
我不明白为什么[NSSocketPortNameServer portForName:host:]花了这么长时间。也许我做错了什么。
有什么好建议吗?
服务器代码
这大约需要0.1秒才能运行。
NSSocketPort* port = [[NSSocketPort alloc] init];
NSConnection* connection = [NSConnection connectionWithReceivePort:port sendPort:nil];
[[NSSocketPortNameServer sharedInstance] registerPort:port name:@"doug"];连接到服务器的客户端代码
小牛需要5秒的时间。
这过去在山狮和狮子身上大约需要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秒设置的。我不能要求所有用户重新设置这个超时,所以我将继续研究如何处理小牛,以避免这个超时。
发布于 2013-12-31 05:30:04
终于解决了。
最后,我放弃了-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;
}
@endhttps://stackoverflow.com/questions/20776811
复制相似问题