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地址(即不正确的子网)时出现此错误,更正主机修复了问题