2014-11-16 5 views
0

sftp를 통해 파일을 다운로드하려고하는데 지금까지 ssh 세션을 통해 서버에 연결했는데 ssh 세션을 사용하여 sftp 세션을 열었습니다. . 서버에서 파일을 열었고 sftp_read()를 사용하여 파일에서 블록 블록을 가져 왔습니다. 내 코드는 다음과 같습니다 블록을 읽을 때 sftp_read는 파일에서 읽을 때 큰 블록 블록을 이동합니다.

char buffer[16384] = {}; 
ssize_t nbytes; 
ssize_t ntotal = 0; 
for (;;) { 
    nbytes = sftp_read(file, buffer, sizeof(buffer)); 

    if (nbytes == 0) { 
     break; // EOF 
    } 

    localFile << buffer; 
    ntotal += nbytes; 
    //sftp_seek(file, ntotal); 
} 

그러나 어떤 이유로

은 처음 20 바이트는 정확하지만 1만6천3백84번째 바이트까지 21 위로 잘못이다. 20 바이트를 읽은 후 독자가 파일의 16384 번째 바이트로 점프하고 아무 일도 일어나지 않는 것처럼 계속 읽는 것으로 나타났습니다.

나는 약간의 테스트를했는데 16384, 21, 22, 50 등 어떤 버퍼로든 버퍼를 변경했다면 올바르게 20 바이트를 읽은 후에도 16384 바이트로 넘어갔습니다.

이유가 있습니까? 오류없이 사용할 수있는 libssh 및 sftp보다 우수한 라이브러리가 있습니까?

+1

,''나는 표준을 사용하고 – programmerjake

+0

을 localFile.write (버퍼, nbytes)를 사용하여 : : SFTP를 통해 파일을 복사하는 또 다른 방법을 원하는 사람을 위해, 단지 사용 ofstream은 로컬 파일에 기록합니다. 전에 구문을 잘 했어. – Stapps

+1

그럼 문제가 있습니다. localFile << 버퍼; sftp에서 2 바이트 밖에 없더라도 파일에 항상 16384 바이트를 기록합니다. 그래서 임의의 데이터를 파일에 씁니다. 프로그래머 잼이 맞아! – asn

답변

-1

결국 libssh를 사용할 필요가 없었습니다. 올바르게 스트림에 기록하지 않을

system("scp -i private_key [email protected]:directory_to_file/file.txt path_to_local_dir/file.txt"); 
+0

안녕하세요, 제가 가지고있는 또 다른 문제는 원격 서버에 연결하는 데 사용한 코드 스 니펫을 보낼 수 있습니까? – Kimutai