在重新启动的服务器上使用connect()重新连接返回-传输终结点已连接
好吧,我读这篇文章是为了寻找正确的答案,但它似乎不符合我的目的 现在,麻烦来了: 我有一个C语言的传统客户机-服务器体系结构(所有套接字都是非阻塞的),其中服务器正在侦听传入的连接,而客户机尝试连接。第一次连接成功,一切正常,直到我在服务器上按Ctrl+C 代码的客户端检测到连接丢失并启用重试计时器。 客户端代码应该通过在每次定时器弹出时使用POSIX间隔定时器,在服务器上反复尝试重新连接。但是,它不会关闭插座或重新启动。现在,每次重试连接时,connect()都会返回 传输终结点已连接 即使重新启动服务器(使用SO_REUSEADDR并成功启动),连接也不会完成。 我需要实现的一件事是服务器上的信号处理程序,用于在Ctrl+C上关闭在重新启动的服务器上使用connect()重新连接返回-传输终结点已连接,c,sockets,networking,C,Sockets,Networking,好吧,我读这篇文章是为了寻找正确的答案,但它似乎不符合我的目的 现在,麻烦来了: 我有一个C语言的传统客户机-服务器体系结构(所有套接字都是非阻塞的),其中服务器正在侦听传入的连接,而客户机尝试连接。第一次连接成功,一切正常,直到我在服务器上按Ctrl+C 代码的客户端检测到连接丢失并启用重试计时器。 客户端代码应该通过在每次定时器弹出时使用POSIX间隔定时器,在服务器上反复尝试重新连接。但是,它不会关闭插座或重新启动。现在,每次重试连接时,connect()都会返回 传输终结点已连接 即使
但是,我是否需要关闭客户端的套接字描述符,并在每次断开连接时重新启动,或者是否有办法解决此问题?套接字无法重用
一旦所服务的套接字的连接在两个方向上断开,该套接字将无法使用
close()
断开连接时关闭客户端套接字,并为新连接创建新套接字
更新(基于以下评论):
在OP的情况下,一端(服务器端)发生故障(通过服务器进程结束)。这意味着该进程持有的所有套接字都是隐式的
close()
ed,因此在两个方向上都是shutdown()
。“套接字服务在两个方向上都下降了”,如果只有一侧下降了怎么办?@Anshul:这不是关于哪一侧是shutdown()
(下降了),但是,正如我所写的,关于哪个方向是shutdown()
。插座是全双工的,可以说在两个方向上独立工作。这意味着即使服务器关闭套接字进行读取,它仍然可以将数据写入客户端和vica。但是,这不适用于您描述的情况,因为您的问题表明服务器进程已结束,这意味着服务器进程保持打开的任何套接字都是隐式的close()
ed,并且在两个方向上都是隐式的shutdown()
。@Anshul:请注意调用shutdown()之间的差异
和关闭()。您可能想查看相关的手册页。shutdown()
不是他要问的。他在问一个同伴倒下的案子。答案是,如果任何一个对等方出现故障,连接就会中断。您无法重新连接TCP套接字。您必须关闭它并创建一个新的。