【问题标题】:EAGAIN EWOULDBLOCK AndroidEAGAIN EWOULDBLOCK Android
【发布时间】:2013-10-01 23:58:38
【问题描述】:

我开发了一个 Android 应用程序,它有多个设备通过蓝牙套接字连接将数据发送回服务器设备,但是我遇到了错误:

E/bt-btif: send none, EAGAIN or EWOULDBLOCK, errno:11

我已经读到这些错误发生在接收设备的套接字缓冲区已满的套接字连接上,但是我不确定如何在 Android 应用程序中处理它。有没有办法在尝试之前检查这些错误传输,或者如果它们发生捕获它们并稍后重试传输?

【问题讨论】:

    标签: java android sockets bluetooth


    【解决方案1】:

    如果你得到EAGAIN,只需再次重试相同的操作。

    如果你得到EWOULDBLOCK,你必须使用非阻塞套接字,并且请求的操作会导致套接字阻塞调用线程。使用select()等待阻塞条件清除,然后重试原来的操作。

    【讨论】:

    • EAGAIN 和 EWOULDBLOCK 是同一个 errno. 的不同名称,只有您的第二段适用。
    • EAGAIN 在所有平台上并不总是与 EWOULDBLOCK 相同,这就是我将它们分开的原因。 What does EAGAIN mean?
    • 学习起来很有趣,我通过使用 BufferedOutputStream 进行套接字通信来确保它有一个缓冲区用于当时无法传输的字节以便稍后重试。
    • 是一样的。如果您收到EAGAINEWOULDBLOCK.,则必须致电select() 如果您为EAGAIN 推荐不涉及select() 的替代策略,您需要为此提供引用。另一个 SO 答案不是规范性参考。
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多