2010-04-22 2 views
2

다양한 SO 답변에 대해 잘 모순되는 진술로 혼란이있는 것 같습니다. What's causing my java.net.SocketException: Connection reset?. 여기에 수용된 응답에 연결이 다른 쪽에서 닫혔다는 것을 알 수 있습니다. 하지만 이것은 사실이 아닙니다. 연결을 닫아도 연결이 재설정되지 않습니다. "기본 TCP/IP 오류"로 표시됩니다.Java : 연결 재설정의 원인에 대한 혼란 해결

내가 알고 싶은 것은 SocketException: Connection reset이 "unerlying TCP/IP Error"외에 실제로 의미하는 것입니다. 이게 진짜 원인이야? 연결을 닫을 때 예외는 아니며 닫힌 연결을 읽는 것이 "기본 TCP/IP 오류"가 아니기 때문에 연결이 닫히는 것과 관련이 있다는 것을 의심 할 수 있습니다.

내 가설은 (의 전부 또는 단지 잘못 TCP/IP에 따라)를 지정해 SocketTimeoutException. 그리고 더 데이터가 생성되지 않은 경우에만 생성이

연결 재설정는 ACK 패킷을 확인하는 서버의 실패 원인이다 으로 표시됩니다 (이는 특정 기간 이후에 읽는 동안 throw되고 데이터를 기다리는 동안 읽기가 ACK 패킷과 관련이 없기 때문입니다.) 즉, read()는 SocketTimeoutExceptio 할당 된 시간에 실제 데이터 (DATA LAYER)의 바이트를 읽지 않은 경우 n.

답변

2

openjdk6 소스에서 ECONNRESET 오류 (Linux & Solaris) 또는 WSAECONNRESET (Windows)으로 데이터 읽기 시도가 실패 할 때 "연결 재설정"이 실행 된 것처럼 보입니다.

내 경험상 전형적인 원인은 소켓의 다른 쪽 끝에있는 파티가 먼저 종료를 수행하지 않고 소켓을 닫았 기 때문입니다.

+0

'jdk/src/solaris/native/java/net/SocketInputStream.c'에서 "Connection reset"메시지는'ECONNRESET'뿐만 아니라'EPIPE'에 의해서도 발생할 수 있습니다. – hertzsprung

1

내 경험에 따르면 클라이언트가 요청을 중단하면 (사용자가 탭을 닫거나 다른 링크를 클릭했을 때) 발생합니다.

+2

웹 응용 컨텍스트에서 약간 이야기하고 있습니다. 질문은 웹 응용 프로그램에 관한 것이 아닙니다. – BalusC

+0

정말 어떤 질문인지 모르겠지만 링크 된 질문은 Tomcat 오류 로그를 보여줍니다. '연결 재설정'메시지는 클라이언트가 연결을 갑자기 닫을 때 발생합니다. 다른 상황에서도 가능합니다. – Guillaume