我一直在阅读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标志将是流中的下一个整数。
有人可以向我解释以下哪项适用:
答案 0 :(得分:1)
ScpTo.java
是SCP protocol的实现。
checkAck
方法读取的标志是来自服务器(ack)的SCP协议响应。
它与TCP无关,它在协议栈上面是两层,远离你,不仅是JSch中的SSH层,而且主要是Java和OS。
我相信不幸的是,SCP协议没有规范。您只能在OpenSSH scp
代码中引用SCP的规范实现,以了解协议。
短暂:对于客户端发送的每个命令,服务器都以单字节“ack”响应,其中:
0x00
成功0x01
错误0x02
是致命错误