AFNetworking/NSURLConnection 接收 NSPOSIXErrorDomain Code=9 "操作无法完成。错误的文件描述符"

Posted

技术标签:

【中文标题】AFNetworking/NSURLConnection 接收 NSPOSIXErrorDomain Code=9 "操作无法完成。错误的文件描述符"【英文标题】:AFNetworking/NSURLConnection receiving NSPOSIXErrorDomain Code=9 "The operation couldn’t be completed. Bad file descriptor" 【发布时间】:2014-02-27 06:44:36 【问题描述】:

在我使用 AFNetworking/NSURLConnection 向服务器发送请求的应用程序中,我有时(很少)在操作失败块中看到此错误:

Error Domain=NSPOSIXErrorDomain Code=9 "The operation couldn’t be completed. Bad file descriptor"

https://devforums.apple.com/message/278770#278770 有一个类似问题的答案:

这意味着有人从 NSURLConnection 下释放文件描述符。

但在我自己的代码中,我不会以任何方式触及任何文件描述符流。这只是简单的 GET/POST 请求。

这个问题的原因可能是什么?

有人在他们的 AFNetworking 操作中遇到过这个错误吗?

另外,如果我真的想关闭这个文件描述符,我怎么能故意关闭呢?这个问题的答案将帮助我更好地理解问题。

【问题讨论】:

嗨,我刚开始与我的一位客户遇到同样的错误。你有没有找到问题的根源? 不,很遗憾。我只是将它们视为任何其他网络错误。 我在 ios 15 上使用 NSURLSession,偶尔也会收到此错误。 【参考方案1】:

根据this Apple TechNote关于多任务和网络,如果应用程序被挂起并回收套接字,您可以获得EBADF(POSIX错误9)。

注意:当您的应用恢复执行时,实际返回的错误 资源已被回收的套接字是故意不 此处指定以允许将来改进。然而,在很多情况下 错误将是EBADF,这可能不是你的样子 期待!一般情况下EBADF表示app有 将无效的文件描述符传递给系统调用。然而,在 资源已被回收的套接字的情况,并不意味着 文件描述符无效,只是套接字没有 使用时间更长。

【讨论】:

【参考方案2】:

(我不认为这是一个完整的答案,但我希望它会有所帮助并且可以变成一个。)

您正在查看的错误EBADF。它是从关闭文件操作中返回的。但你已经想通了。 :)

假设您没有使用 stdio 库,我认为您遇到的情况相当于过度发布。基本上,您将文件的所有权移交给某物,然后将其关闭。

您应该特别注意NSFileHandle,尤其是查看您或任何人是否正在调用initWithFileDescriptor:copy 文件等。这些可能导致NSFileHandle 获取文件描述符的所有权,这意味着当它被释放时关闭它。

少看你的网络代码,多看你如何设置文件。

【讨论】:

感谢您的回答!根据我的代码,这个错误直接来自 NSURLConnectionDelegate connection:didFailWithError: callback。我在应用中打开的任何文件怎么会导致此错误? 文件的行为更像是原始指针而不是 Objective-C 对象,如果这对你有意义的话。一个对象可以被多次拥有,并且每个所有权标志都需要在对象本身从内存中释放之前消失。相反,您只需关闭文件句柄一次即可将其关闭。这就是为什么我想知道是否有多个对象具有相同的文件句柄,并且其中一个文件句柄正在关闭。

以上是关于AFNetworking/NSURLConnection 接收 NSPOSIXErrorDomain Code=9 "操作无法完成。错误的文件描述符"的主要内容,如果未能解决你的问题,请参考以下文章