close () SSL-сокет сразу после receive (): unsafe? - PullRequest
0 голосов
/ 10 мая 2018

Разумно ли / безопасно закрывать () сокет сразу после последнего получения ()?

Я спрашиваю, потому что я изучил, что происходит на отправляющей стороне сокета, и если я использую 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

Это означает, что при втором вызове socket.checkWrite(); Java проверяет, доступен ли для записи сокет после отправки последнего фрагмента данных. Тогда возможна гонка, когда на принимающей стороне я закрываюсь после получения последнего чанка, но до того, как отправляющая сторона выполнит свою последнюю проверку, и я получаю SocketException, брошенный на отправляющую сторону.

То, что я описал в параграфе выше, кажется, что на самом деле происходит со мной в https://issues.apache.org/jira/browse/AMQ-6956. Сокет в точке второй проверки находится в состоянии cs_SENT_CLOSE = 5, и я получаю SocketException.

Относится к: сокет close () сразу после send (): unsafe?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...