IT이야기

"소프트웨어로 인해 연결이 중단되었습니다: 소켓 쓰기 오류"의 공식 이유

cyworld 2022. 7. 4. 22:47
반응형

"소프트웨어로 인해 연결이 중단되었습니다: 소켓 쓰기 오류"의 공식 이유

지정된 스택 트레이스 스니펫

원인 : java.netSocket Exception:소프트웨어로 인해 접속이 중단되었습니다.소켓 쓰기 오류
java.net 에 접속해 주세요.Socket Output Stream(Socket Output Stream)socketWrite0(네이티브 방식)

저는 다음 질문에 답하려고 했습니다.

  1. 이 예외를 발생시키는 코드는 무엇입니까?(JVM?/톰캣?/내 코드?
  2. 이 예외가 발생하는 원인은 무엇입니까?

#1에 대해서:

Sun의 JVM 소스에는 이 정확한 메시지가 포함되어 있지 않지만 Software cause connection abort: socket write error라는 텍스트가 포함되어 있다고 생각합니다.SocketOutputStream:

private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
                 int len) throws IOException;

#2에 대해서

클라이언트가 완전한 응답을 받기 전에 접속을 종료했을 때(예를 들어 요구를 송신했지만 완전한 응답을 받기 전에 종료/종료/오프라인)가 원인이라고 추측됩니다.

질문:

  1. 위의 전제 조건 (#1 및 #2)이 맞습니까?
  2. 이것은, 「서버측의 네트워크 에러에 의해서 클라이언트에 쓸 수 없었습니다」라고 하는 상황과는 다른 것입니까.아니면 같은 오류 메시지가 표시됩니까?
  3. 가장 중요한 것은 다음과 같습니다.상기 내용을 기재한 공식 문서(예: Sun)가 있습니까?

이 스택 트레이스가 소켓클라이언트의 "장애"라는 증거가 필요합니다.서버가 회피할 수 있는 것은 아무것도 없습니다.(예외를 포착하거나 Sun JVM 이외의 SocketOutputStream을 사용하는 것 이외에는 둘 다 클라이언트가 종료된 사실을 실제로 회피하지 않습니다.)

이 오류는 데이터 재전송 실패 후 WinSock이 확립된 연결을 닫았을 때(수신기는 데이터 스트림소켓으로 전송된 데이터를 수신하지 않음)와 같이 로컬네트워크 시스템이 연결을 중단할 때 발생할 수 있습니다.

MSDN 문서를 참조하십시오.'소프트웨어로 인해 연결이 중단됨'에 대한 일부 정보를 참조하십시오.

소켓(TCP )의 작성 또는 액세스에 에러가 발생했을 때에, 가 느려집니다.일반적으로 이 문제는 서버가 연결을 제대로 닫지 않고 종료했을 때 발생할 수 있으므로 완전한 응답을 얻기 전에 발생합니다.대부분의 경우, 타임 아웃의 문제(응답에 시간이 너무 걸리거나 서버가 요구로 과부하되는 등) 또는 클라이언트가 SYN을 송신했지만 ACK(접속 종료의 확인 응답)를 수신하지 않은 것이 원인일 수 있습니다.타임아웃 문제의 경우 타임아웃 값을 늘리는 것을 고려할 수 있습니다.

일반적으로 소켓 예외에는 문제에 대한 지정된 세부 메시지가 포함되어 있습니다.

자세한 메시지의 예:

  • 소프트웨어로 인해 접속이 중단되었습니다.recv가 실패했습니다.

    이 오류는 메시지를 발송하려고 시도했으며 서버에 의해 연결이 중단되었음을 나타냅니다.데이터베이스 연결 중에 이 문제가 발생한 경우 호환되지 않는 Connector/JDBC 드라이버를 사용하는 것이 원인일 수 있습니다.

    가능한 해결책:CLASSPATH에 적절한 라이브러리/드라이버가 있는지 확인합니다.

  • 소프트웨어로 인해 접속이 중단되었습니다.접속행.

    이 문제는 리모트에 접속하는 데 문제가 있을 때 발생할 수 있습니다.를 들어 바이러스 검사기가 원격 메일 요청을 거부하기 때문입니다.

    가능한 해결책:Virus scan service(바이러스 검색 서비스)가 발신 연결 요청에 대해 포트를 차단하는지 확인합니다.

  • 소프트웨어로 인해 연결이 중단되었습니다.소켓 쓰기 오류입니다.

    가능한 해결책:스트림에 올바른 바이트 길이를 쓰고 있는지 확인하십시오.그러니 당신이 보내는 것을 다시 한 번 확인해 보세요.실을 보세요.

  • 피어에 의해 연결이 재설정됨: 소켓 쓰기 오류/피어에 의해 연결이 중단됨: 소켓 쓰기 오류

    애플리케이션은, 서버측에서 킵 얼라이브 접속이 타임 아웃이 되었는지 아닌지를 체크하지 않았습니다.

    가능한 해결책:연결에서 E13222_01읽기 전에 HttpClient가 null이 아님을 확인하십시오.

  • 피어에 의해 접속이 리셋 되었습니다.

    피어(서버)에 의해 접속이 종료되었습니다.

  • 연결이 리셋되었습니다.

    요청으로 인해 연결이 클라이언트에 의해 종료되었거나 연결의 서버 측에 의해 종료되었습니다.

    자세한 내용은 java.net의 원인을 참조하십시오.Socket Exception: 연결을 재설정하시겠습니까?

워크스테이션/노트북의 기업 방화벽이 방해가 되면 연결이 끊어지는 것을 가장 자주 봐왔습니다.

예를 들어 서버 프로세스와 클라이언트 프로세스가 같은 머신에 있습니다.서버는 모든 인터페이스(0.0.0)를 수신하고 클라이언트는 퍼블릭인터페이스 또는 홈인터페이스로의 접속을 시도합니다(루프백인터페이스 127.0.0.1은 주의해 주세요).

기기가 네트워크에 접속되어 있지 않은 경우(Wifi가 꺼진 경우 등), 접속이 형성됩니다.머신이 기업 네트워크(직접 또는 VPN)에 접속되어 있는 경우는, 접속이 형성됩니다.

단, 기기가 퍼블릭 Wifi(또는 홈네트워크)에 접속되어 있는 경우 방화벽에 의해 접속이 끊어집니다.이 경우 클라이언트를 루프백인터페이스에 접속하는 것은 정상적으로 동작하며 홈인터페이스나 퍼블릭인터페이스에는 접속하지 않습니다.

이게 도움이 됐으면 좋겠다.

wireshark를 사용하여 TCP/IP 통신을 감시하고 포트를 닫는 사람이 누구인지 확인합니다.또한 타임아웃도 관련이 있을 수 있습니다.

단순한 클라이언트 서버 프로그램을 사용하다가 이 오류가 발생하는 경우 닫히지 않은(또는 일찍 닫히지 않은) 입력 스트림 또는 출력 스트림에 문제가 있습니다.

Tomcat 소스 코드와 JVM 소스를 확인했습니까?그것이 당신에게 더 많은 도움을 줄지도 몰라요.

저는 당신의 일반적인 생각이 좋다고 생각합니다.나는 예상한다ConnectException접속할 수 없는 시나리오에서요.위는 클라이언트 주도로 되어 있는 것 같습니다.

나도 같은 문제에 직면해 있었다.
일반적으로 이러한 종류의 오류는 클라이언트가 접속을 종료하고 서버가 해당 클라이언트에 쓰기를 시도하기 때문에 발생합니다.
따라서 서버가 출력 스트림을 완료할 때까지 클라이언트의 접속이 열려 있는지 확인합니다.
그리고 한 가지 더, 입출력 스트림을 닫는 것을 잊지 마세요.

이게 도움이 됐으면 좋겠다.
아직 문제가 해결되지 않은 경우에는 여기에 문제를 자세히 설명하지 마십시오.

올바른 증명서를 cacerts trustore로 Import했는데도 이 오류가 발생하는SSLPoke.bat(SSL 트러블 슈팅 스크립트) 창 스크립트가 있었다.

C:\Java\jdk1.8.0_111\jre\lib\security>SSLPoke.bat

C:\Java\jdk1.8.0_111\jre\lib\security>"C:\jdk1.8.0_101\jre\bin\java" 
     `SSLPoke  tfs.corp.****.com  443`

java.net.SocketException: Software caused connection abort: recv failed
    `at java.net.SocketInputStream.socketRead0(Native Method)`
    `at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)`
    `at java.net.SocketInputStream.read(SocketInputStream.java:170)`
    `at java.net.SocketInputStream.read(SocketInputStream.java:141)`
    `at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)`
    `at sun.security.ssl.InputRecord.read(InputRecord.java:503)`
    `at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)`
    `at sun.security.ssl.SSLSocketImpl.performInitialHandshake
       (SSLSocketImpl.java:1375)`
    `at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747)`
    `at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)`
    `at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:138)`
    `at SSLPoke.main(SSLPoke.java:28)`

그 후, 제 직장의 네트워크 변경에 관한 오래된 메모를 확인했습니다.경우에 따라서는 JVM 파라미터를 추가해야 합니다.-Djava.net.preferIPv4Stack=true to make connections to certain machines이 에러를 회피하기 위해서,

C:\Java\jdk1.8.0_111\jre\lib\security>"C:\Java\jdk1.8.0_111\bin\java"  
    **-Djava.net.preferIPv4Stack=true**  SSLPoke tfs.corp.****.com 443

정상적으로 연결되었습니다.

SSLPoke 코드는 https://gist.github.com/4ndrej/4547029 에서 다운로드할 수 있습니다.

비누로 비누 서비스를 테스트하는 동안 이 오류가 발생했습니다.UI 클라이언트, 기본적으로 매우 큰 메시지(500kb 이상)와 Soap을 얻으려고 했습니다.UI가 시간 초과로 연결을 닫았습니다.

SoapUI에서 다음 주소로 이동합니다.

파일 --> 프리퍼런스 --소켓타임아웃(ms)

...180000(3분)과 같은 큰 값을 입력하면 파일이 매우 크기 때문에 문제를 완벽하게 해결할 수는 없지만 적어도 응답은 얻을 수 있습니다.

다른 클라이언트의 닫힌 연결

제 경우 오류는 다음과 같습니다.

java.net.SocketException: Software caused connection abort: recv failed

H2 데이터베이스에 액세스하는 Java 응용 프로그램을 디버깅하는 동안 일식이 수신되었습니다.오류의 원인은 처음에 SQuirreL로 데이터베이스를 열어 무결성을 수동으로 확인했기 때문입니다.플래그를 사용하여 동일한 DB에 대한 여러 연결을 활성화했습니다(예:AUTO_SERVER=TRUEJava에서 DB에 접속하는 데 문제가 없었습니다.

이 오류는 잠시 후(긴 자바 프로세스) 리소스를 해방하기 위해 SQuirreL을 닫기로 결정했을 때 발생했습니다.이는 SQL이 DB 서버 인스턴스를 "소유"하고 있고 SQL 연결을 통해 종료된 것처럼 보입니다.

Java 애플리케이션을 재기동해도, 에러는 재발하지 않았다.

설정

  • 윈도 7
  • 이클립스 케플러
  • SQuirel 3.6
  • org.h2. 드라이버 버전 1.4.192

다음에 설명하는 상황에서는 클라이언트 측에서 이러한 예외가 발생합니다.

서버는 클라이언트 증명서를 인증하도록 요구받지만 클라이언트는 확장 키 사용이 클라이언트 인증을 지원하지 않는 증명서를 제공하므로 서버는 클라이언트의 증명서를 받아들이지 않고 연결을 종료합니다.

서버에서 이틀 동안 이 예외가 발생했습니다.연결 해제 기능을 이동하여 해결했습니다.

outputStream.close();
inputStream.close();
Client.close();

목록 스레드의 마지막까지.도움이 된다면요

내 경우 클라이언트와 서버 측을 분리했는데 예외는 다음과 같습니다.

원인 : 인수 마샬링 오류.네스트된 예외는 java.net 입니다.Socket Exception:소프트웨어로 인해 접속이 중단되었습니다.소켓 쓰기 오류

클라이언트와 서버의 클래스가 다른 경우.클라이언트에 서버 클래스(인터페이스)를 다운로드하지 않고 프로젝트에 동일한 파일을 추가할 뿐입니다.하지만 경로는 완전히 같아야 합니다.예를 들어 서버 프로젝트에서는 java\rmi\services 패키지에 서비스가 포함되어 있습니다.인터페이스와 구현에서는 클라이언트 프로젝트에 동일한 패키지를 작성해야 합니다.예를 들어 java/rmi/server/services로 변경하면 위의 예외가 발생합니다.인터페이스 버전이 클라이언트와 서버 간에 다른 경우에도 같은 예외입니다(빈 행이 잘못 추가된 경우에도 마찬가지).내 생각에 rmi는 버전을 확인하기 위해 일종의 클래스 해시를 만드는 것 같아...나도 몰라...도움이 된다면...

나머지 API 호출을 조롱하면서 wire Mock도 같은 문제에 직면했습니다.이전에는 다음과 같이 서버를 정의하고 있었습니다.

WireMockServer wireMockServer = null;

단, 다음과 같이 정의해야 합니다.

@Rule 
public WireMockRule wireMockRule = new WireMockRule(8089);

언급URL : https://stackoverflow.com/questions/2126607/official-reasons-for-software-caused-connection-abort-socket-write-error

반응형