【问题标题】:What are possible reason for socket error EINPROGRESS in solaris?solaris中套接字错误EINPROGRESS的可能原因是什么?
【发布时间】:2011-11-26 11:01:57
【问题描述】:

Solaris 中套接字错误EINPROGRESS 的可能原因是什么? 我们如何检查根本原因?

tcp api 是:连接

【问题讨论】:

  • 这意味着你有一个异步的事情正在发生,它还没有完成。如果您想要建设性的答案,请说明您正在谈论的系统调用。
  • 我已经通过添加有关如何在此处获取更多详细信息的手册页摘录向您指出了如何继续:stackoverflow.com/q/8277540/694576
  • 无论如何,至少向我们展示您客户的代码肯定会有所帮助......

标签: c sockets tcp solaris


【解决方案1】:

你有一个非阻塞套接字,你正在其中调用connect()。由于connect() 需要发生 3 次握手(因此是网络往返),它要么在阻塞套接字中阻塞等待 SYN-ACK,要么在非阻塞套接字中给出一些指示它尚未成功。通常,非阻塞套接字返回 EAGAIN/EWOULDBLOCK 告诉您它们无法继续,您应该再试一次:这不完全是您的情况,connect() 在没有可用的临时端口告诉您时返回 EAGAIN/EWOULDBLOCK您应该稍后再试;所以非阻塞连接还有另一个错误:EINPROGRESS,它告诉你操作正在进行中,你应该稍后检查它的状态。

稍后要检查状态,套接字将准备好可写,因此您可以使用select()/poll()/... 进行测试,之后您必须getsockopt(...SO_ERROR...) 才能获得成功/失败状态你的 connect() 操作。

【讨论】:

  • 现在我只在非阻塞中检查 EAGAIN/EWOULDBLOCK 错误,所以在非阻塞中,如果必须选择 EINPROGRESS 错误以及 EAGAIN/EWOULDBLOCK 错误也
  • @Syedsma:只有 connect() 返回 EINPROGRESS。
  • 只是想知道,如果 select 返回 true(例如 select for write),则连接成功,但要设置的最后一个 errno 是 EINPROGRESS。在这种情况下是否应该忽略此错误?
【解决方案2】:

您显然在使用非阻塞套接字,您需要使用select()poll() 来确定何时可以写入(连接是一种写入形式)到套接字。当您希望将数据实际写入连接的套接字时也是如此;你不只是在你喜欢的时候编写和连接,你要求套接字告诉你什么时候可以做事情,同时你可以做其他事情(异步套接字操作的想法)。

检查您的手册页,了解可用错误代码的绝对真实性:

$ man connect

[EINPROGRESS] 套接字是非阻塞的,无法立即完成连接。可以通过选择要写入的套接字来选择(2)完成。

【讨论】:

    【解决方案3】:

    我在尝试(使用 FFMPEG)连接到无效的本地 IP 地址(即不正确的子网)时收到此错误,更正主机解决了问题

    【讨论】:

    • 我认为您不会因此获得 EINPROGRESS 吗?
    • 我没有直接调用connect 我使用的是网络客户端:FFMPEG。这可能是客户端实现中的错误。我只能报告我所看到的以及它是如何修复的。希望能像我一样帮助另一个人。
    猜你喜欢
    • 2013-06-16
    • 2013-06-25
    • 1970-01-01
    • 2011-11-18
    • 2014-10-08
    • 2022-07-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多