Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux中连接非阻塞套接字的正确方法是什么_Linux_Sockets - Fatal编程技术网

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

在linux中连接非阻塞套接字的正确方法是什么,linux,sockets,Linux,Sockets,我对Linux中的sockets编程还不熟悉,对于如何正确进行非阻塞连接,我有一个疑问 我已经创建了一个套接字描述符,并为非阻塞IO设置了O_NONBLOCK。我调用connect,它返回EINPROGRESS,然后调用select,并带有一个超时值 如何判断连接操作超时需要多长时间?我可以在我的程序中更改这个吗 如果我的select操作超时,那会怎样?关闭套接字描述符,创建另一个,然后重试连接是否正常?或者,是否有方法取消现有套接字上的连接并使用相同的套接字描述符重试该操作 谢谢。连接完成后,

我对Linux中的sockets编程还不熟悉,对于如何正确进行非阻塞连接,我有一个疑问

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

如何判断连接操作超时需要多长时间?我可以在我的程序中更改这个吗

如果我的select操作超时,那会怎样?关闭套接字描述符,创建另一个,然后重试连接是否正常?或者,是否有方法取消现有套接字上的连接并使用相同的套接字描述符重试该操作


谢谢。

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

如何判断连接操作超时需要多长时间

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

我可以在我的程序中更改这个吗

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

如果我的select操作超时,那会怎样

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

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

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

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

不可以。一旦连接失败,插座就失效,必须关闭

如何判断连接操作超时需要多长时间

你没有。您必须提前决定您需要的合理超时时间,然后将该值传递给select。我通常使用5-30秒之间的任何时间,这取决于我的应用程序运行的网络类型

我可以在我的程序中更改这个吗

最终,不会。操作系统控制着等待连接超时的时间。您可以调整操作系统特定的设置来控制超时,但这不是可移植的或推荐的

如果我的select操作超时,那会怎样

您唯一能做的就是关闭插座,然后再试一次

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

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


否。

默认连接系统超时时间通常很长,无法通过两个拨号调制解调器、卫星和信鸽连接。谢谢Remy和EJP。这些答案很有帮助,我为这些令人困惑的问题感到抱歉。我正在编写的程序将在安装在远程位置的设备上运行,这些设备必须通过不可靠的网络、蜂窝或卫星进行连接,因此连接尝试可能会在一分钟内失败,然后在下一分钟成功。根据您所说的,当连接尝试失败时,正确的方法是关闭套接字描述符,创建一个新的套接字描述符,然后重新尝试连接。