Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
在重新启动的服务器上使用connect()重新连接返回-传输终结点已连接_C_Sockets_Networking - Fatal编程技术网

在重新启动的服务器上使用connect()重新连接返回-传输终结点已连接

在重新启动的服务器上使用connect()重新连接返回-传输终结点已连接,c,sockets,networking,C,Sockets,Networking,好吧,我读这篇文章是为了寻找正确的答案,但它似乎不符合我的目的 现在,麻烦来了: 我有一个C语言的传统客户机-服务器体系结构(所有套接字都是非阻塞的),其中服务器正在侦听传入的连接,而客户机尝试连接。第一次连接成功,一切正常,直到我在服务器上按Ctrl+C 代码的客户端检测到连接丢失并启用重试计时器。 客户端代码应该通过在每次定时器弹出时使用POSIX间隔定时器,在服务器上反复尝试重新连接。但是,它不会关闭插座或重新启动。现在,每次重试连接时,connect()都会返回 传输终结点已连接 即使

好吧,我读这篇文章是为了寻找正确的答案,但它似乎不符合我的目的

现在,麻烦来了:

我有一个C语言的传统客户机-服务器体系结构(所有套接字都是非阻塞的),其中服务器正在侦听传入的连接,而客户机尝试连接。第一次连接成功,一切正常,直到我在服务器上按Ctrl+C

代码的客户端检测到连接丢失并启用重试计时器。 客户端代码应该通过在每次定时器弹出时使用POSIX间隔定时器,在服务器上反复尝试重新连接。但是,它不会关闭插座或重新启动。现在,每次重试连接时,connect()都会返回

传输终结点已连接

即使重新启动服务器(使用SO_REUSEADDR并成功启动),连接也不会完成。 我需要实现的一件事是服务器上的信号处理程序,用于在Ctrl+C上关闭


但是,我是否需要关闭客户端的套接字描述符,并在每次断开连接时重新启动,或者是否有办法解决此问题?

套接字无法重用


一旦所服务的套接字的连接在两个方向上断开,该套接字将无法使用

close()
断开连接时关闭客户端套接字,并为新连接创建新套接字


更新(基于以下评论):


在OP的情况下,一端(服务器端)发生故障(通过服务器进程结束)。这意味着该进程持有的所有套接字都是隐式的
close()
ed,因此在两个方向上都是
shutdown()

“套接字服务在两个方向上都下降了”,如果只有一侧下降了怎么办?@Anshul:这不是关于哪一侧是
shutdown()
(下降了),但是,正如我所写的,关于哪个方向是
shutdown()
。插座是全双工的,可以说在两个方向上独立工作。这意味着即使服务器关闭套接字进行读取,它仍然可以将数据写入客户端和vica。但是,这不适用于您描述的情况,因为您的问题表明服务器进程已结束,这意味着服务器进程保持打开的任何套接字都是隐式的
close()
ed,并且在两个方向上都是隐式的
shutdown()
。@Anshul:请注意调用
shutdown()之间的差异
关闭()。您可能想查看相关的手册页。
shutdown()
不是他要问的。他在问一个同伴倒下的案子。答案是,如果任何一个对等方出现故障,连接就会中断。您无法重新连接TCP套接字。您必须关闭它并创建一个新的。