Jsch ScpTo示例澄清

时间:2015-03-25 19:01:10

标签: java tcp scp jsch

我一直在阅读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标志无关,那么它与什么有关?

1 个答案:

答案 0 :(得分:1)

ScpTo.javaSCP protocol的实现。

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

它与TCP无关,它在协议栈上面是两层,远离你,不仅是JSch中的SSH层,而且主要是Java和OS。

我相信不幸的是,SCP协议没有规范。您只能在OpenSSH scp代码中引用SCP的规范实现,以了解协议。

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

  • 0x00成功
  • 0x01错误
  • 0x02是致命错误
如果可能的话,我强烈建议你不要使用SCP。使用SFTP(JSch(以及其他SSH实现)本身支持