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

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

tcp api是:connect

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

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

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

有关可用错误代码的绝对真实性,请查看您的联机帮助页:

 $ man connect 

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

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