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

Sye*_*sma 6 c sockets solaris tcp

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

tcp api是:connect

nin*_*alj 18

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

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


tro*_*foe 8

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

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

$ man connect
Run Code Online (Sandbox Code Playgroud)

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