首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSSocketPortNameServer portForName:主机:对小牛慢慢来

NSSocketPortNameServer portForName:主机:对小牛慢慢来
EN

Stack Overflow用户
提问于 2013-12-25 21:13:17
回答 1查看 198关注 0票数 0

对于小牛,[NSSocketPortNameServer portForName:host:]现在需要大约5秒的时间来解析本地主机。它过去要快得多,大约0.01秒。

我的代码与Apple对分布式对象的介绍中的代码相同。

我过去能够启动一个子进程,并在不到0.1秒内连接到它。我的档案经理运行多个子进程,因此目前在小牛上已经失效。该应用程序没有沙箱。

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

有什么好建议吗?

服务器代码

这大约需要0.1秒才能运行。

代码语言:javascript
复制
NSSocketPort* port = [[NSSocketPort alloc] init];
NSConnection* connection = [NSConnection connectionWithReceivePort:port sendPort:nil];
[[NSSocketPortNameServer sharedInstance] registerPort:port name:@"doug"];

连接到服务器的客户端代码

小牛需要5秒的时间。

这过去在山狮和狮子身上大约需要0.1秒。

代码语言:javascript
复制
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秒设置的。我不能要求所有用户重新设置这个超时,所以我将继续研究如何处理小牛,以避免这个超时。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-31 05:30:04

终于解决了。

最后,我放弃了-portForName:host:,而是通过命令行将端口号传递给子进程。

子进程以下列方式与父进程联系:

代码语言:javascript
复制
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];

子进程通过命令行从父进程获取端口号。父进程通过此类别找到自己的端口号。

代码语言:javascript
复制
@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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20776811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档