Felipe Gutierrez
Felipe Gutierrez

Reputation: 535

Connection was forcibly closed by the remote host

I have a java.nio.channels.SocketChannel in my jSCSI implamantation that is disconnecting when I try to open a driver with size greater than 4GB. The iscsi RFC says that the BasicHeaderSegment.BHS_FIXED_SIZE may be 48, so with this position I can read the bytes on the channel. The java doc says 5 types of errors, but my app is throwing the last one that doesn't say a specific information.

  1. NotYetConnectedException
  2. ClosedChannelException
  3. AsynchronousCloseException
  4. ClosedByInterruptException
  5. IOException

Code:

public final int read(final SocketChannel sChannel) throws InternetSCSIException, IOException, DigestException {
// read Basic Header Segment first to determine the total length of this
// Protocol Data Unit.
clear();

final ByteBuffer bhs = ByteBuffer.allocate(BasicHeaderSegment.BHS_FIXED_SIZE);
int len = 0;
while (len < BasicHeaderSegment.BHS_FIXED_SIZE) {
    int lens = sChannel.read(bhs);
    if (lens == -1) {
        // The Channel was closed at the Target (e.g. the Target does
        // not support Multiple Connections)
        // throw new ClosedChannelException();
        return lens;
    }
    len += lens;
    LOGGER.trace("Receiving through SocketChannel: " + len + " of maximal " + BasicHeaderSegment.BHS_FIXED_SIZE);

}
bhs.flip();

error:

java.io.IOException: An existing connection was forcibly closed by the remote host
    at sun.nio.ch.SocketDispatcher.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
    at sun.nio.ch.IOUtil.read(IOUtil.java:197)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:379)
    at org.jscsi.parser.ProtocolDataUnit.read(ProtocolDataUnit.java:417)
    at org.jscsi.target.connection.TargetSenderWorker.receiveFromWire(TargetSenderWorker.java:145)
    at org.jscsi.target.connection.Connection$TargetConnection.receivePdu(Connection.java:217)
    at org.jscsi.target.connection.phase.TargetFullFeaturePhase.execute(TargetFullFeaturePhase.java:96)
    at org.jscsi.target.connection.Connection$TargetConnection.call(Connection.java:264)
    at org.jscsi.target.connection.Connection$TargetConnection.call(Connection.java:79)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
[pool-9-thread-1] INFO org.jscsi.target.connection

Thanks in advance, Felipe

Upvotes: 5

Views: 32314

Answers (2)

Edward Tomasz Napierala
Edward Tomasz Napierala

Reputation: 1846

It looks like the other side disconnected you due to some kind of problem. Assuming you're developing the initiator, you should check the target (server) system logs.

Can you explain the 4GB comment? I mean, what exactly does "open a driver with size greater than 4GB" mean, what driver?

Upvotes: 0

user207421
user207421

Reputation: 311052

Your problem description is incorrect. The SocketChannel isn't closed: the connection is; and it isn't happening when you try to open the connection: it is happening when you read from it.

This usually results from sending something after the peer has already closed the connection, which in turn usually means you had previously sent it something it didn't understand.

Upvotes: 4

Related Questions