【问题标题】:AFNetworking/NSURLConnection receiving NSPOSIXErrorDomain Code=9 "The operation couldn’t be completed. Bad file descriptor"AFNetworking/NSURLConnection 接收 NSPOSIXErrorDomain Code=9 "操作无法完成。错误的文件描述符"
【发布时间】: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,偶尔也会收到此错误。

标签: ios nsurlconnection afnetworking


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

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