2012-08-01 6 views
0

libssh2_scp_send()을 사용하여 한쪽에서 다른쪽으로 파일을 성공적으로 보낼 수 있습니다. 그러나 libssh2_scp_recv()을 사용하여 파일을 수신하려고 시도하면 데이터에 struct stat 매개 변수가 채워지지 않습니다. 파일 크기는 항상 "0"을 반환합니다. libssh2_scp_recv가 struct stat을 채우지 않습니다.

struct stat file_info; 

LIBSSH2_CHANNEL *channel = libssh2_scp_recv(session, source_file, &file_info); 

printf("file_info.st_size = %lu.\n",  file_info.st_size); 

file_info에서 다른 필드

channel이 NULL이 아닌 경우에도, 너무 비어 온다. 내 세션이 제대로 열리고 다른 SSH 작업 작동됩니다

(파일 전송, 원격 때 명령을 실행 ...) 나는 "libssh2-1.3.0"를 사용하고

.

실마리가 있습니까?

정말로 감사합니다.


는 편집 :

나는에 세 번째 줄을 변경 :

fprintf(stderr, "** file_info { st_size = %lu; st_atime = %lu }. SSH last error = %d", 
    file_info.st_size, file_info.st_atime, 
    libssh2_session_last_errno(info->session)); 

그리고 그 결과는 다음과 같습니다 그것 뿐이다

** file_info { st_size = 0; st_atime = 0 }. SSH last error = 0`. 

. 반환 된 채널은 유효하며 읽을 수 있습니다. libssh2_session_last_errno()은 오류는 발생하지 않지만 st_size은 여전히 ​​비어 있습니다.

답변

0

시도는 일부 오류 검사를 수행하는, 그래서 우리는 무슨 일을 정확하게 볼 수 있습니다

channel = libssh2_scp_recv(session, path_to_file, &struct_stat); 
if (!channel && (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) 
{ 
    if ((struct_stat.st_mode == 0) && (struct_stat.st_atime == 0) && \ 
      (struct_stat.st_mtime == 0) && (struct_stat.st_size == 0)) 
    { 
     fprintf(stderr, "No file found and the error %d\n", \ 
        libssh2_session_last_errno(session)); 

     exit (EXIT_FAILURE); 
    } 
} 

희망이 도움이.

감사합니다.

+0

이것은 더 정확한 진단을 가능하게 할 것이지만, 파일이 존재하고 데이터가 있다는 것을 알기조차 왜'st_size == 0'을 설명하지는 않습니다. 더 이상 바이트가 없을 때까지 파일을 읽으려고하면 올바르게 읽을 수 있습니다. – JaxWR

+0

@JaxWR : libssh2_session_last_errno (세션)를 반환하는 대상은 무엇입니까? – TOC

+0

@JaxWR : 코드없이 더 많은 문제 해결을 할 수 없습니다! – TOC

0

시스템의 libssh2_scp_recv (session, source_file, & file_info)에 의해 source_file의 시간 및 권한 모드 만 변경됩니다. 따라서 file_info.st_ctim.tv_sec 및 file_info.st_mode에는 유효한 값이 있습니다.

libssh2_scp_recv에 대한 libssh2 API 설명서 인 http://libssh2.sourceforge.net/doc/#libssh2scprecv을 보면, file_info의 모든 필드가 채워질 것이라고 보장 할 수 없습니다.

파일 끝은 libssh2_channel_read가 반환하는 단일 NULL (0) 바이트로 표시됩니다.

관련 문제