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秒.
以尼古拉的答案为基础,
Socket s;
...
s.setSoLinger(true,0);
Run Code Online (Sandbox Code Playgroud)
在Java中是等价的.
编辑:你可能想看的另一件事是setReuseAddress(true);