회사에서 생산 한 장치의 신호를 수신하는 네트워크 서버에 문제가 발생했습니다. 장치는 방금 사용한 원본 포트를 때때로 재사용합니다. 이로 인해 SYN이 서버에 의해 삭제됩니다. 그런 다음 장치는 이전 소켓이 서버의 TIME_WAIT에서 벗어날 때까지 재 시도합니다. 서버가 SYN-ACK를 보낸다.Java 네트워크 서버 및 TIME_WAIT
서버는 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);
을 그리고 클라이언트 소켓이 설정 한 다음했습니다 : 서버 소켓에
나는 다음과 같은 옵션을 사용하고
내가 모두 true와 false로 SO_LINGER를 시도Socket client = server.accept();
client.setKeepAlive(false);
client.setSoLinger(true, 0);
client.setReuseAddress(true);
client.setTcpNoDelay(true);
client.setSoTimeout(CLIENT_READ_TIMEOUT);
, 동일한 추적 결과가 표시됩니다. CLIENT_READ_TIMEOUT은 10 초로 설정됩니다.