gpt4 book ai didi

Java 网络服务器和 TIME_WAIT

转载 作者:行者123 更新时间:2023-11-29 06:25:59 31 4
gpt4 key购买 nike

我遇到了一个网络服务器问题,该服务器从我公司生产的设备接收信号。设备偶尔会重用它刚刚使用过的源端口。这会导致 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);

客户端socket接收后设置如下:

Socket client = server.accept();
client.setKeepAlive(false);
client.setSoLinger(true, 0);
client.setReuseAddress(true);
client.setTcpNoDelay(true);
client.setSoTimeout(CLIENT_READ_TIMEOUT);

我试过 SO_LINGER 为真和假,跟踪结果完全相同。 CLIENT_READ_TIMEOUT 设置为 10 秒。

最佳答案

以尼古拉的回答为基础,

Socket s;
...
s.setSoLinger(true,0);

在 Java 中是等价的。

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

关于Java 网络服务器和 TIME_WAIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/922951/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com