2011-11-26 198 views
3

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

TCP API是:连接

+1

它意味着你有一个异步的事情怎么回事,它尚未。如果你想要建设性的答案,请指定你在说什么系统调用。 – Mat

+0

我已经指出如何继续添加手册页提取关于如何在此获取更详细的信息:http://stackoverflow.com/q/8277540/694576 – alk

+0

无论如何,向我们展示至少您的客户的代码肯定会帮助... – alk

回答

8

显然你是使用非阻塞套接字,你需要使用select()poll()以确定何时可以写(连接是写的一种形式)的插座。当您希望将数据写入连接的套接字时,情况也是如此;当你感觉喜欢它时,你不仅要写和连接,还要让套接字告诉你什么时候可以做事,同时你还做了其他事情(异步套接字操作的想法)。

检查您的联机帮助有关可用错误代码的绝对真理:

$ man connect 

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

12

你有一个非阻塞的插座,你打电话给它connect()。由于connect()需要发生三次握手(所以是网络往返),它会阻止在阻塞套接字中等待SYN-ACK,或者给您一些指示,说明它尚未在非阻塞套接字中成功。通常情况下,非阻塞套接字会返回EAGAIN/EWOULDBLOCK,告诉您它们无法进步,您应该再试一次:这不完全是您的情况,connect()返回EAGAIN/EWOULDBLOCK,因为没有免费的临时端口来告诉您应该稍后再试;所以对于非阻塞连接还有一个错误:EINPROGRESS,它告诉你该操作正在进行,你应该稍后检查它的状态。

以后要检查状态,套接字将成为准备好可写,所以你可以使用select()/poll()/...测试为,在这之后,你必须getsockopt(...SO_ERROR...)让你连接的成功/失败状态()操作。

+0

现在我只在EAGAIN/EWOULDBLOCK中发生非阻塞错误,所以在非阻塞时,如果必须做EINPROGRESS错误和EAGAIN/EWOULDBLOCK错误一起选择 – Syedsma

+1

@Syedsma:only connect( )返回EINPROGRESS。 – ninjalj

+0

只是想知道,如果选择返回true(例如选择写),连接成功,但最后设置的errno是EINPROGRESS。在这种情况下应该忽略这个错误? – Bionix1441

-1

我试图连接到一个无效的本地IP地址(即不正确的子网),当这个错误,纠正主机固定问题

相关问题