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
Sockets 客户端和服务器之间的TCP连接出错_Sockets_Unix_Tcp - Fatal编程技术网

Sockets 客户端和服务器之间的TCP连接出错

Sockets 客户端和服务器之间的TCP连接出错,sockets,unix,tcp,Sockets,Unix,Tcp,我在同一台主机上运行的服务器和客户端之间建立TCP连接。在我们的案例中,我们不断地从服务器上收集和阅读信息,或者说来源。 我们读取3个不同端口上的数据 一旦源停止发布数据或重新启动,服务器/源将无法在同一端口上再次发布数据,说明端口已绑定。给出的原因是客户端仍然在这些端口上建立了连接 我想知道可能的原因是什么?由于我们尝试了这种重新连接机制,客户端已经在侦听这些端口并尝试一次又一次地重新连接,所以可能会出现问题。我更多的是在源代码方面寻找原因,因为当源代码和客户端位于不同的主机上时,客户端的代码

我在同一台主机上运行的服务器和客户端之间建立TCP连接。在我们的案例中,我们不断地从服务器上收集和阅读信息,或者说来源。 我们读取3个不同端口上的数据

一旦源停止发布数据或重新启动,服务器/源将无法在同一端口上再次发布数据,说明端口已绑定。给出的原因是客户端仍然在这些端口上建立了连接

我想知道可能的原因是什么?由于我们尝试了这种重新连接机制,客户端已经在侦听这些端口并尝试一次又一次地重新连接,所以可能会出现问题。我更多的是在源代码方面寻找原因,因为当源代码和客户端位于不同的主机上时,客户端的代码是相同的,而不是同一个主机对我们来说工作得很好

编辑:- 我在阅读各种文章时发现了这一点

关于使用SO_LINGER在关闭时发送RST以避免时间等待状态的问题:我的路由器访问服务器(保留名称以保护罪犯)存在一些问题,这些服务器在处理专用于特定通道的调制解调器上的背对背连接时遇到问题。他们所做的是放弃连接,接受另一个呼叫,尝试连接到主机上的已知套接字,并且主机拒绝连接,因为存在涉及已知套接字的处于TIME\u WAIT状态的连接。(史蒂文斯的书《TCP图解,第1卷》更详细地讨论了这个问题。)为了避免连接被拒绝的问题,我必须在服务器启动断开连接时在服务器中安装一个选项,以便在关闭时重置

链接至来源:-


我想我也面临同样的问题:“尝试连接到主机上的已知套接字,但主机拒绝连接”。可能的修复提到的是“当服务器启动断开连接时,在服务器关闭时进行重置的选项”。现在我该怎么做呢?

在重新启动/关闭服务器之前,您需要关闭绑定到该端口的套接字

另外,还有一个超时时间,我认为是4分钟,所以如果您创建了一个TCP套接字并将其关闭,您可能仍然需要等待4分钟,直到它关闭


您可以使用netstat查看系统上的所有绑定端口。如果关闭服务器,或在连接分叉后关闭服务器,可能会有绑定到某些端口的僵尸进程,这些端口不会关闭并保持活动状态,因此无法重新绑定到同一端口。显示一些代码

在绑定服务器套接字并调用
listen()之前,在服务器套接字上设置
SO\u REUSEADDR
选项。


编辑建议随意使用
以便保留
选项对飞行中的数据毫无价值和危险。只需使用
SO\u RESUSEADDR.

netstat就可以显示客户端连接仍然存在,但我不确定它是来自客户端的连接,还是由于服务器在未关闭套接字的情况下以不正确的方式关闭。问题是,当客户端进程关闭时,服务器可以再次在这些端口上发布。如何关闭服务器上的套接字?发生的情况是,我相信服务器套接字没有发送TCP连接的握手,并且您的客户端仍在使用该套接字,或者,由于您没有在服务器上关闭它,所以该套接字保持打开状态(并且它卡在一个僵尸进程中)。确保在how中调用值为2的shutdown,而不是close,以确保套接字完全关闭(无需等待传输)。在退出拥有套接字的进程之前,不需要关闭它。Linux将为您做到这一点,包括亲密握手。添加关机不会改变行为。你的链接没有其他说明。-在退出拥有它的进程之前,你不需要关闭套接字。如果你这样做。不要对非代码的文本使用代码格式。请不要对非代码的文本使用代码格式。编辑了我的问题,给出了我面临的确切情况。你的答案对那件事还是正确的吗?