远程主机强制关闭了连接。

5
我在我的jSCSI实现中使用了java.nio.channels.SocketChannel,当我尝试打开一个大于4GB的驱动器时,它会断开连接。iSCSI RFC表示BasicHeaderSegment.BHS_FIXED_SIZE可以为48,因此我可以在通道上读取字节。Java文档提供了5种错误类型,但我的应用程序抛出的是最后一种错误,该错误没有提供具体信息。
以下是可能发生的五种异常类型:
  1. NotYetConnectedException
  2. ClosedChannelException
  3. AsynchronousCloseException
  4. ClosedByInterruptException
  5. IOException
代码:
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();

错误:

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

感谢您的提前帮助,Felipe。

请注意标题的更正。您的SocketChannel仍然处于打开状态。是连接被强制关闭了。 - user207421
2个回答

4
你的问题描述不正确。SocketChannel 没有关闭,连接已经关闭;这不是在尝试打开连接时发生的,而是在从连接中读取数据时发生的。
通常情况下,这是由于在对等方已经关闭连接后发送了一些内容,这通常意味着你之前发送了它无法理解的内容。

我正在搜索这个链接上的iscsi属性,也许我可以增加超时时间,但我不知道要编辑什么 http://blogs.msdn.com/b/san/archive/2008/07/27/microsoft-iscsi-software-initiator-isns-server-timers-quick-reference.aspx - Felipe Gutierrez
超时与此无关。你似乎没有读过这个答案。 - user207421

0

看起来对方由于某种问题与您断开了连接。假设您正在开发发起者,您应该检查目标(服务器)系统日志。

您能解释一下4GB的评论吗?我的意思是,“打开一个大小大于4GB的驱动程序”具体是什么驱动程序?


我需要挂载驱动器,使其乘以2。例如:4GB、8GB、16GB。 - Felipe Gutierrez
你的意思是“驱动器”,如一个LUN、磁盘,对吧?因此,4GB看起来很可疑。iSCSI本身没有与4GB相关的边缘条件。也许这是一个SCSI级别的问题?再次,请检查目标日志是否有任何有趣的内容? - Edward Tomasz Napierala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接