什么是在linux中连接非阻塞套接字的正确方法

时间:2014-08-25 19:07:00

标签: linux sockets

我不熟悉使用Linux中的套接字进行编程,并对正确进行非阻塞连接的方法提出疑问。

我已经创建了一个套接字描述符,并为非阻塞IO设置了O_NONBLOCK。我调用connect,它返回EINPROGRESS,然后调用select,带有超时值。

如何判断connect()操作在超时之前需要多长时间?我可以在程序中更改此内容吗?

如果我的选择操作超时,那么呢?关闭套接字描述符,创建另一个,然后重试连接是正常的吗?或者,有没有办法取消现有套接字上的连接并使用相同的套接字描述符重试该操作?

感谢。

2 个答案:

答案 0 :(得分:1)

连接完成后,套接字FD将变为可写。您还应该通过getsockopt()检查套接字的最后一个错误。

  

如何判断connect()操作在超时之前需要多长时间?

当然,你不能。你必须尝试一下。这个问题没有意义。

  

我可以在程序中更改此内容吗?

如果这就是你的意思,你可以改变选择超时。如果不是,我不明白这个问题。请注意,通过这种方式可以减少大约一分钟的平台默认连接超时,但是无法增加它。

  

如果我的选择操作超时,那么呢?

关闭套接字并执行应用程序对连接超时所需的任何操作。

  

关闭套接字描述符,创建另一个,然后重试连接是否正常?

只有你有理由认为下次会得到不同的结果。

  

或者,有没有办法取消现有套接字上的连接并使用相同的套接字描述符重试该操作?

没有。一旦连接失败,套接字就会死机,必须关闭。

答案 1 :(得分:1)

  

如何判断connect()操作在超时之前需要多长时间?

你没有。您必须提前确定合理超时对您的需求是多少,然后将该值传递给select()。我通常使用5到30秒之间的任何时间,具体取决于我运行的应用程序的网络类型。

  

我可以在程序中更改此内容吗?

最终,没有。操作系统控制等待连接超时的时间。可能存在特定于操作系统的设置,您可以通过调整来控制超时,但这不是可移植的或推荐的。

  

如果我的选择操作超时,那么呢?

你唯一能做的就是关闭套接字再试一次。

  

关闭套接字描述符,创建另一个,然后重试连接是否正常?

  

或者,有没有办法取消现有套接字上的连接并使用相同的套接字描述符重试该操作?

没有