0

我有一个需要底层的类方法CFSocket,并且该方法经常被调用,因此每次运行该方法时创建和销毁新套接字的成本太高。因此,我创建了static一个 CFSocketRef 实例,因此我可以在方法调用之间共享一个套接字:

+(void)myStaticMethod {
    static CFSocketRef udpSocket;

    @synchronized(self) {
        if (!udpSocket) {
            udpSocket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, NULL, NULL);
            int yes = 1;
            setsockopt(CFSocketGetNative(udpSocket), SOL_SOCKET, SO_NOSIGPIPE, (void *)&yes, sizeof(yes));
        }
    }

    //method body
}

我有两个问题:

  1. 当应用程序终止时,我是否必须担心破坏(无效)套接字,或者它是否会自行关闭?
  2. 哪些事件可能导致套接字自行关闭,您将如何防止可能写入 bad CFSocketRef
4

1 回答 1

1

如果一个应用程序真的终止了,那么包括套接字在内的所有资源都会被释放。但通常应用程序不会终止而是进入后台,在这种情况下,套接字可能会变得无效。这在技术说明 TN2277中有很好的描述。特别参见“数据套接字”部分。

由于创建 UDP 套接字是一个简单的操作,因此来自 TN2277 的以下建议将适用于您的代码:

如果重新打开您的数据套接字简单、便宜并且没有用户可见的后果,那么最好的方法是在应用程序进入后台时关闭套接字,并在它回到前台时重新打开它。这使您的生活变得非常简单;事实上,如果你这样做,你可以完全忽略本节的其余部分!

于 2012-09-17T11:28:54.077 回答