solaris中插座错误EINPROGRESS的可能原因是什么?

时间:2011-11-26 11:01:58

标签: c sockets tcp solaris

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

tcp api是:connect

3 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:8)

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

检查您的联系手册,了解有关可用错误代码的绝对真相:

$ man connect
  

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

答案 2 :(得分:-1)

尝试连接(使用FFMPEG)到无效的本地IP地址(即不正确的子网)时出现此错误,更正主机修复了问题