簡體   English   中英

NSSocketPortNameServer portForName:host:在Mavericks上運行緩慢

[英]NSSocketPortNameServer portForName:host: slow on Mavericks

現在,使用Mavericks [NSSocketPortNameServer portForName:host:]大約需要5秒鍾才能解析本地主機。 過去速度要快得多,大約為0.01秒。

我的代碼與Apple的《分布式對象簡介 》中的代碼相同。

我曾經能夠在不到0.1秒的時間內啟動子進程並連接到該子進程。 我的文件管理器運行多個子進程,因此,在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采取的措施以避免此超時。

終於解決了。

我最終放棄了-portForName:host:而是通過命令-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM