Solaris中的套接字错误EINPROGRESS
可能是什么原因?
我们如何检查根本原因?
tcp api是:connect
答案 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地址(即不正确的子网)时出现此错误,更正主机修复了问题