【问题标题】:Jsch ScpTo example clarificationJsch ScpTo 示例说明
【发布时间】:2015-05-29 15:11:57
【问题描述】:

我一直在阅读Jsch ScpTo Example,但无法理解他们在做什么。更具体地说,我无法理解 checkAck 方法的工作原理。

checkAck方法:

static int checkAck(InputStream in) throws IOException{
    int b=in.read();
    // b may be 0 for success,
    //          1 for error,
    //          2 for fatal error,
    //          -1
    if(b==0) return b;
    if(b==-1) return b;

    if(b==1 || b==2){
        StringBuffer sb=new StringBuffer();
        int c;
        do {
            c=in.read();
            sb.append((char)c);
        }
        while(c!='\n');
        if(b==1){ // error
            System.out.print(sb.toString());
        }
        if(b==2){ // fatal error
            System.out.print(sb.toString());
        }
    }
    return b;
}

这似乎是在引用 TCP 协议中的 ACK 标志。但是,在阅读 TCP 协议时,似乎在 TCP 标头中发送了相当多的内容。但是,当调用该方法时,它不必对所有这些进行排序并提取标志。它只是假设 ACK 标志将是流中的下一个整数。

有人可以向我解释以下哪一项适用:

  1. 为什么这个假设是有效的,
  2. 提取标志的正确方法,
  3. 在调用方法之前,他们如何确保输入流始终位于正确的标志上,或者
  4. 如果这与 TCP ACK 标志无关,它与什么有关?

【问题讨论】:

    标签: java tcp scp jsch


    【解决方案1】:

    ScpTo.javaSCP protocol 的实现。

    checkAck 方法读取的标志是来自服务器的 SCP 协议响应 (ack)。

    它与 TCP 无关,它位于协议栈的下面两层,对你隐藏,不仅是 JSch 中的 SSH 层,主要是 Java 和 OS。

    我认为不幸的是,没有针对 SCP 协议的规范。您只能参考 OpenSSH scp 代码中的 SCP 规范实现,以了解协议。

    不久:对于客户端发送的每个命令,服务器都会以单字节“ack”响应,其中:

    • 0x00 成功
    • 0x01 是错误
    • 0x02 是致命错误

    如果可能,我强烈建议您不要使用 SCP。使用 JSch(和其他 SSH 实现)原生支持的 SFTP

    【讨论】:

    • 感谢您的澄清。不幸的是,我无法使用 SFTP。 SCP 明确地是我正在从事的项目中唯一允许的文件传输协议。
    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2016-03-03
    相关资源
    最近更新 更多