即使在应用程序崩溃后,IPV6 ServerSocket仍在监听

时间:2014-11-12 13:41:28

标签: java sockets ipv6 serversocket netstat

我使用:

创建了一个ServerSocket
InetSocketAddress inetsktaddr = new InetSocketAddress(0);
ServerSocket sckt = new ServerSocket();
sckt.bind(inetsktaddr);
Socket socket = sckt.accept();

当应用程序运行时,使用我发现的netstat,

TCP    0.0.0.0:49906          0.0.0.0:0              LISTENING       9196
TCP    [::]:49906             [::]:0                 LISTENING       9196

当应用程序崩溃时,netstat结果显示:

TCP    [::]:49906             [::]:0                 LISTENING       9196

当搜索进程id 9196时,不存在这样的进程。它是应用程序运行时的java.exe进程ID。这是怎么发生的?

我使用的是java 1.5和Windows 7 Professional

修改

过了一段时间后,我发现了以下内容: 我的应用程序启动mysql数据库。有时当java.exe崩溃时,mysql不会崩溃。数据库服务器将仅启动。当这个问题出现时(::独自处于侦听状态),我杀死了mysql进程,立即说明:: socket停止侦听。因此,当java崩溃时,mysql会以某种方式阻止::消失。无法找到原因。

1 个答案:

答案 0 :(得分:0)

Atlast我找到了原因,它是一个JVM Bug。 (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6598160

子进程只会继承IPV6 SOCKET HANDLES而不是IPV4 SOCKET HANDLES。因此问题出现在我身上。

修复是我应该升级JVM或仅在ipv4服务器套接字中监听。