8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

“软件导致连接中止:套接字写入错误”的官方原因

Computer says 'no'--SOooooo 2月前

112 0

给出此堆栈跟踪片段导致:java.net.SocketException:软件导致连接中止:java.net.SocketOutputStream.socketWrite0(本机方法)处的套接字写入错误

给出这个堆栈跟踪片段

原因:java.net.SocketException:软件导致连接中止:套接字写入错误
在 java.net.SocketOutputStream.socketWrite0(本机方法)

我尝试回答以下问题:

  1. 什么代码引发了此异常?(JVM?/Tomcat?/我的代码?)
  2. 什么原因导致抛出这个异常?

关于#1:

Sun 的 JVM 源代码不包含这个确切的消息,但我认为文本 软件导致连接中止:套接字写入错误 来自本机实现 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,尽管两者都不能真正避免客户端已终止的事实)

帖子版权声明 1、本帖标题:“软件导致连接中止:套接字写入错误”的官方原因
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Computer says 'no'--SOooooo在本站《sockets》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @Amogh - 看起来是这样,是的。基本上从答案的描述来看,这是一个特定于 Windows 的错误,但我假设在 Linux 上你会得到相同的异常,只是措辞不同......(我对此的外行理解基本上是,这是由于你通过套接字发送到某个远程位置 X 并且 X 在中间断开连接而导致的,但我确信这不是最准确的描述方式)

  • 对我来说,这种情况发生在数据库服务器重新启动并且应用程序仍在尝试使用先前打开的连接进行查询时。不确定为什么这些没有刷新,因为我们使用的是基于 DBCP 的池。但重新启动应用程序解决了这个问题。

  • 当本地网络系统中止连接时,可能会发生此错误,例如当数据重新传输失败后 WinSock 关闭已建立的连接(接收器从未确认在数据流套接字上发送的数据)。

    请参阅 此 MSDN 文章 。另请参阅 有关“软件导致连接中止”的一些信息 .

  • @MatGessel 这篇文章只是重复了这种混乱,并增加了一些自己的混乱。WSAECONNABORTED 是一个 Winsock 错误代码,因此不可能有 Berkeley 对此的解释。关于 HTTP 服务器所描述的情况将产生 ECONNRESET,而不是 WSAECONNABORTED。

  • @rustyx 此处引用的所有三个来源都表明它是由 ACK 故障引起的。如果您有自己的主张来源,请注明来源。

  • 这不是一个真正的答案,因为它没有提供进一步解决问题的信息。这里的答案基本上是“网络上发生了一些不好的事情”。了解哪些进一步的日志和其他活动记录可以帮助我查明潜在问题将非常有帮助。

  • 套接字 (例如 时出错时,会抛出 java.net.SocketException TCP 这通常是由于服务器在获得完整响应之前终止了连接(未正确关闭)。在大多数情况下,这可能是由超时问题(例如响应花费的时间太长或服务器因请求而超载)或客户端发送了 SYN,但未收到 ACK(连接终止确认)引起的。对于超时问题,您可以考虑增加超时值。

    套接字异常通常附带有关该问题的指定详细消息。

    详细消息示例:

    • 点3

      点4

      点5

    • p6

      p7

      p8

    • p9

      p10

    • p11

      p12

      p13

    • p14

      p15

    • p16

      p17

      p18

  • 这 6 点中只有一点回答错了。其他几点也都是错误的。应用程序无法“检查服务器端的保持连接是否超时”。HttpClient 为空不可能导致 SocketException。没有将正确的长度写入流也不可能。

  • 我最常看到这种情况,当工作站/笔记本电脑上的公司防火墙阻碍时,它会中断连接。

    例如,我在同一台机器上有一个服务器进程和一个客户端进程。服务器正在监听所有接口 (0.0.0.0),而客户端则尝试连接到公共/主接口(请注意,不是环回接口 127.0.0.1)。

    如果机器的网络断开(例如 wifi 关闭),则连接已建立。如果机器已连接到公司网络(直接或通过 vpn),则连接已建立。

    但是,如果机器连接到公共 wifi(或家庭网络),防火墙就会启动并终止连接。在这种情况下,将客户端连接到环回接口可以正常工作,但不能连接到家庭/公共接口。

    希望这可以帮助。

  • 引用 11

    监视 TCP/IP 通信 wireshark 并查看谁实际关闭了端口,超时也可能与此有关。

  • @EJP 我见过这种情况,当过载并耗尽内存时。我不确定是操作系统关闭了连接,但 JVM 出了问题。

  • @Zee 关闭端口(在 Wireshark 中显示为 FIN)与中止连接(不显示)之间存在差异。

  • 2pha 2月前 0 只看Ta
    引用 14

    对于使用简单的客户端服务器程序并收到此错误的任何人来说,这是一个未关闭(或过早关闭)输入或输出流的问题。

  • 尽管将正确的证书导入 cacerts trustore,但 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)`
    

    在网络中 -Djava.net.preferIPv4Stack=true to make connections to certain machines 添加 JVM 参数

    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

  • 您是否检查过 Tomcat 源代码JVM 源代码?这可能会给您更多帮助。

    我认为你的总体思路很好。我预计 ConnectException 在无法连接的情况下会出现这种情况。上面的内容看起来很像是客户端驱动的。

  • @Ehrann - 消息字符串最有可能来自本机源。但您还应该检查事件日志。在我看来,后者可能更具参考价值。

  • 我遇到了同样的问题。
    通常,这种错误的发生是因为客户端已关闭其连接而服务器仍在尝试向该客户端进行写入。
    因此,请确保您的客户端连接保持打开状态,直到服务器完成其输出流为止。
    还有一件事,不要忘记 关闭输入和输出流。

    希望这可以帮助。
    如果仍然遇到问题,请在此简要介绍您的问题。

  • 引用 19

    @BhavinChhatrola 不,答案不正确。所描述的情况会导致“对等方重置连接”,而不是问题中的错误。

  • 当我使用 SoapUI 客户端测试我的 soap 服务时发生了这个错误,基本上我试图获取一条非常大的消息 (>500kb) 但 SoapUI 因超时关闭了连接。

    在 SoapUI 上,转到:

    文件-->首选项--套接字超时(毫秒)

    ...并输入一个较大的值,例如 180000(3 分钟),这不会完美地解决您的问题,因为文件实际上太大,但至少您会得到答复。

返回
作者最近主题: