Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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
C 如何终止非阻塞套接字连接尝试?_C_Linux_Sockets_Connect_Nonblocking - Fatal编程技术网

C 如何终止非阻塞套接字连接尝试?

C 如何终止非阻塞套接字连接尝试?,c,linux,sockets,connect,nonblocking,C,Linux,Sockets,Connect,Nonblocking,对于如何在使用套接字时对连接尝试设置时间限制的问题,一个典型的答案是: 1) 使插座不堵塞 2) 调用connect() 3) 使用select()查看连接是否成功 目前我不清楚的是,如果无法建立连接,如何在一定时间后终止连接尝试。据我所知,即使在select()返回后(如果select()超时小于操作系统超时),操作系统仍将继续尝试建立连接 这是正确的吗?如果是,我如何停止这个过程?将插座切换回阻塞状态是否足够?除了关闭插座,还有其他选择吗?谢谢。只要合上插座。如果您认为连接时间太长,那么它对

对于如何在使用套接字时对连接尝试设置时间限制的问题,一个典型的答案是:

1) 使插座不堵塞

2) 调用
connect()

3) 使用
select()
查看连接是否成功

目前我不清楚的是,如果无法建立连接,如何在一定时间后终止连接尝试。据我所知,即使在
select()
返回后(如果
select()
超时小于操作系统超时),操作系统仍将继续尝试建立连接


这是正确的吗?如果是,我如何停止这个过程?将插座切换回阻塞状态是否足够?除了关闭插座,还有其他选择吗?谢谢。

只要合上插座。如果您认为连接时间太长,那么它对您没有任何进一步的用处。操作系统将停止尝试,释放资源,等等,一切你想要的

我认为你唯一的选择是关门或等待。假设,如果可以取消当前正在进行的连接尝试,您将如何处理套接字?将它连接到其他目的地?改变你对方向的想法,把它当作一个监听插座?关闭它,让新的看起来更简单。这与重用套接字无关,问题在于:1)操作系统做一些不需要的工作,并为此使用资源;2)如果操作系统在select()返回后建立连接,并且应用程序假设没有建立连接,我不确定会发生什么。connect()/select()调用是复杂的多线程应用程序的一部分。我担心的是,“忘记”连接尝试可能会导致代码的其他部分触发一些不必要的事件,其后果很难看出,因此我更愿意可靠地停止操作系统的尝试。所以关闭它。问题是什么?没错,关闭套接字是一个选项,尽管通常套接字会在处理连接尝试和其他内容的对象的析构函数中关闭。然而,回到我最初的问题——如果我将套接字切换回阻塞模式,操作系统会停止尝试连接吗?这不是一个“选项”。这是唯一的选择。将套接字切换回阻塞模式只会导致下一个操作阻塞。它没有你建议的效果。我不知道你为什么认为会,或者你为什么会考虑,为什么不会?我不知道套接字在操作系统级别的实现,但在我看来,当套接字切换到阻塞模式时,终止非阻塞连接尝试是合乎逻辑的。然而,这只是我的猜测,因为我在文档中找不到关于这方面的任何信息,所以这就是我为什么要问的原因。