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

Dav*_*veR 5 sockets linux

我刚接触使用Linux中的套接字进行编程,并且对于进行非阻塞连接的正确方法存有疑问.

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

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

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

谢谢.

use*_*421 2

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

我如何知道 connect() 操作需要多长时间才会超时?

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

我可以在我的程序中更改此设置吗?

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

如果我的选择操作超时了,怎么办?

您关闭套接字并执行应用程序要求的连接超时操作。

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

仅当您有理由认为下次会得到不同的结果时。

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

不可以。一旦连接失败,套接字就失效了,必须关闭。