문제

Java에서 소켓을 만들 때 :

new Socket(host, port);

소켓 생성자가 연결하려고합니다 호스트 : 포트 돌아 오기 전에. Windows에서는 도달 할 수없는 호스트의 경우 거의 즉시 실패하지만 Linux의 경우 소켓이 타임 아웃까지 최대 5 분이 걸릴 수 있습니다.

소켓 생성을 제어 할 수 있다면 다음을 수행 할 수 있습니다.

Socket s = new Socket();
s.bind(..);
s.connect(.., timeout);

그러나 오히려 OS가 합리적인 기본값을 사용하도록합니다. Linux 에서이 설정을 변경하는 방법이 있습니까?

감사

도움이 되었습니까?

해결책

나는 당신이 원한다고 생각합니다 /proc/sys/net/ipv4/tcp_syn_retries. 기본값은 일반적으로 5 또는 6이며 약 3 분 정도 나옵니다.

이것들은 시스템 전체입니다.

다른 팁

OS 설정 변경은 다른 응용 프로그램에 예기치 않게 영향을 줄 수 있으므로 조언합니다. 그만큼 Socket.setSoTimeout() 방법도 도움이 될 수 있습니다.

Linux와 Windows가 여기서 다르게 행동하는 것은 BTW가 완전히 정확하지 않습니다. 초기 Syn Restries (Linux 및 Windows에서 구성 할 수있는) 외에도 이웃 상태와 RST 패킷을 보내는 다른 라우터도 역할을 수행합니다.

Windows의 연결 시도가 즉시 실패하면 라우터에 의해 eighter rsted 또는 이웃이 ARP 수준에서 도달 할 수없는 것으로 인식되었을 가능성이 높습니다. 시도해보십시오 arp -a -v Windows에서 명령하여 도달 할 수없는 호스트를 확인하십시오.

Linux의 경우 사용할 것입니다 ip neigh 로컬 네트워크에 스테이션의 도달 상태를 나열합니다.

이것이 시스템의 TCP/IP 기본 시간 초과 (기본적으로 240 초입니까?)에 달려 있다는 것은 내 이해입니다. 한 가지 옵션은이를 조정하는 것이지만, 이는 타임 아웃 값에 의존하는 동일한 시스템의 다른 프로그램에 영향을 줄 수 있습니다. 이 경우 Java Connect () 호출의 "타임 아웃"값을 단순히 낮추는 것이 더 안전 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top