Java网络服务器和TIME_WAIT

Ale*_*lex 1 java sockets networking

我遇到了一个网络服务器的问题,该服务器接收来自我公司生产的设备的信号.该设备偶尔会重用它刚才使用的源端口.这会导致服务器删除SYN.然后,设备将重试,直到旧套接字在服务器上超出TIME_WAIT.然后服务器进行SYN-ACK.

服务器是用Java编写的.遗憾的是,修改设备以正确循环端口不是一种选择,因为该领域有许多,并且不能更新现有单元.旧的软件是用C++编写的,并以某种方式从Windows TCP堆栈的列表中清除了TIME_WAIT端口.

任何人都可以向我提供有关如何在Windows上绕过Java的TIME_WAIT的建议吗?

编辑:我确实在Wireshark中确认该设备正在重用最近使用的端口.

在服务器套接字上,我使用以下选项:

socket = new ServerSocket();
socket.setPerformancePreferences(3, 2, 1);
socket.setReuseAddress(true);
socket.setSoTimeout(CLIENT_READ_TIMEOUT);
socket.bind(new InetSocketAddress(group.getPort()), MAX_TCP_BACKLOG);
Run Code Online (Sandbox Code Playgroud)

并且客户端套接字在收到后具有以下设置:

Socket client = server.accept();
client.setKeepAlive(false);
client.setSoLinger(true, 0);
client.setReuseAddress(true);
client.setTcpNoDelay(true);
client.setSoTimeout(CLIENT_READ_TIMEOUT);
Run Code Online (Sandbox Code Playgroud)

我已经尝试了SO_LINGER作为true和false,具有完全相同的跟踪结果.CLIENT_READ_TIMEOUT设置为10秒.

Jon*_*ght 5

以尼古拉的答案为基础,

Socket s;
...
s.setSoLinger(true,0);
Run Code Online (Sandbox Code Playgroud)

在Java中是等价的.

编辑:你可能想看的另一件事是setReuseAddress(true);