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