首页 > 解决方案 > 在接收()之后直接关闭()SSL套接字:不安全?

问题描述

在最后一次接收()之后直接关闭()套接字是否明智/安全?

我之所以问,是因为我检查了套接字发送端发生的情况,如果我使用的是 Java 和 TLS,那里的代码是

/**
 * Write the data out, NOW.
 */
@Override
public synchronized void write(byte[] b, int off, int len)
        throws IOException {
    if (b == null) {
        throw new NullPointerException();
    } else if (off < 0 || len < 0 || len > b.length - off) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return;
    }

    // check if the Socket is invalid (error or closed)
    socket.checkWrite();

    // Delegate the writing to the underlying socket.
    try {
        socket.writeRecord(b, off, len);
        socket.checkWrite();
    } catch (Exception e) {
        // shutdown and rethrow (wrapped) exception as appropriate
        socket.handleException(e);
    }
}

来自:http ://hg.openjdk.java.net/jdk/jdk/file/26ac622a4cab/src/java.base/share/classes/sun/security/ssl/AppOutputStream.java#l68

这意味着,在第二次调用 时,Java在发送最后一块数据socket.checkWrite();检查套接字是否可写。然后可以进行竞赛,在接收端我在收到最后一个块之后关闭,但在发送端进行最后一次检查之前,我最终在发送端被抛出。SocketException

我在上一段中描述的似乎是在https://issues.apache.org/jira/browse/AMQ-6956中实际发生在我身上的事情。第二次检查时的套接字处于状态cs_SENT_CLOSE = 5,我得到SocketException.

相关:在发送()之后直接关闭()套接字:不安全?

标签: javasocketsssltcprace-condition

解决方案


推荐阅读