Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos NSSocketPortNameServer portForName:host:slow on Mavericks_Macos_Bonjour_Distributed Objects_Nsconnection_Nssocketport - Fatal编程技术网

Macos NSSocketPortNameServer portForName:host:slow on Mavericks

Macos NSSocketPortNameServer portForName:host:slow on Mavericks,macos,bonjour,distributed-objects,nsconnection,nssocketport,Macos,Bonjour,Distributed Objects,Nsconnection,Nssocketport,使用Mavericks[NSSocketPortNameServer portForName:host://现在解析本地主机大约需要5秒钟。它过去要快得多,大约0.01秒 我的代码与中的相同 我曾经能够在不到0.1秒内启动一个子进程并连接到它。 运行多个子进程,因此目前在Mavericks上已失效。应用程序没有沙盒 我不明白为什么[NSSocketPortNameServer portForName:host:][/code>要花这么长时间。也许我做错了什么 非常感谢您的建议吗? 服务器代码

使用Mavericks
[NSSocketPortNameServer portForName:host://现在解析本地主机大约需要5秒钟。它过去要快得多,大约0.01秒

我的代码与中的相同

我曾经能够在不到0.1秒内启动一个子进程并连接到它。 运行多个子进程,因此目前在Mavericks上已失效。应用程序没有沙盒

我不明白为什么
[NSSocketPortNameServer portForName:host:][/code>要花这么长时间。也许我做错了什么

非常感谢您的建议吗?


服务器代码 这大约需要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主机:nil]
。这没什么区别

如果我使连接无效并尝试再次连接,则
[[NSSocketPortNameServer sharedInstance]portForName:name host:nil]
也需要5秒钟


这是什么原因造成的 当我使用
scutil--DNS
转储DNS配置时,我看到本地域有5秒超时。我怀疑这个超时是在Mavericks之前设置为0秒的。我无法要求所有用户重置此超时,因此我将继续研究如何在Mavericks上避免此超时。

最终解决了此问题

我最终放弃了
-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

这可能与硬件或网络拓扑结构有关,而不是操作系统。。。我不知道你的测试语义是什么。。。但如果它在本地失败,并通过某个网络进行外部尝试,它似乎需要比以前更长的时间。1s@GradyPlayer听起来很有可能。就像它试图通过DNS查找名称,然后最终在本地查找名称一样。