【问题标题】:Orphaned TCP connections after closing client and server关闭客户端和服务器后的孤立 TCP 连接
【发布时间】:2013-07-01 16:17:53
【问题描述】:

我在 java 中实现了一个客户端服务器应用程序,它工作正常。现在,如果我在 shell 中执行 netstat -a 以查看活动连接,我会看到有很多以下形式的孤立连接

TCP 127.0.0.1:54725 Sin-Host:0 LISTENING

例如,如果我在端口 58185 上创建一个服务器,如下所示

TCP 127.0.0.1:58185 Sin-Host:0 LISTENING

当客户端连接到它时,我得到两个连接,如下所示

TCP 127.0.0.1:58185 Sin-Host:0 LISTENING
TCP 127.0.0.1:58185 Sin-Host:58187 ESTABLISHED
TCP 127.0.0.1:58187 Sin-Host:58185 ESTABLISHED

现在当我关闭我的客户端和服务器时,第一个连接仍然存在(即在LISTENING 状态而不是TIMED_WAIT

我认为当我关闭客户端和服务器时,没有理由保持第一个连接。这是一个错误吗?它并没有真正影响我的程序,但我只是想知道,以便我知道它的影响。

**EDIT : How long do these orphans last**

我重新启动了我的系统,所有的孤儿都消失了。我重复了测试,发现即使在应用程序关闭后孤儿仍然存在,但在系统重新启动后消失。

也许我猜这是一些系统设置一开始就阻止它运行。?

【问题讨论】:

  • 定义“关闭我的客户端和服务器”。您是否真的在每种情况下都退出了该过程?
  • @EJP by close 我的意思是我通过关闭整个 Eclipse 杀死了运行服务器的 Eclipse 实例。
  • 听多久?
  • 关闭 eclipse 可能还不够,因为您的程序在单独的进程中运行。你检查过你的程序真的终止了吗?
  • @VishalK 没有。没有Timeout 状态。您大概指的是TIME-WAIT 状态。这个问题是关于LISTENINGESTABLISHED 状态的。这里没有证据表明任何东西都被强行终止了,除了 Eclipse,它似乎对正在运行的应用程序没有任何影响。

标签: java tcp client-server


【解决方案1】:

只要你有一行喜欢

serverSocket.accept();

在您编写代码时,与LISTENING 的连接将保持不变。

accept() 导致端口的LISTENING 状态。

ESTABLSHED 的两条线都用于活动连接。

【讨论】:

  • 如果整个过程退出,则不是,这是这里的实际问题。无论如何,说“accept() 导致端口的监听状态”是完全不真实的。 C listen() API 导致 LISTENING 状态:它由 ServerSocket 的构造函数调用。 -1
  • @EJP 请阅读我对原始问题的评论。似乎程序仍在运行,因此我的分析似乎是正确的......
  • 不,这是不正确的,我已经告诉过你原因了。你的答案是基于一个错误的前提。我重复。造成这种情况的不是accept(),而是ServerSocket的存在和不关闭。
猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2013-03-28
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多