2012-08-01 76 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 2012-08-01 21:29:33

+0

@JaxWR:什麼返回這個libssh2_session_last_errno(會話)? – TOC 2012-08-01 21:46:00

+0

@JaxWR:沒有代碼,我們無法做更多的故障排除! – TOC 2012-08-01 22:26:35

0

我的系統上只有源文件的更改時間和權限模式由libssh2_scp_recv(session,source_file,& file_info)填充。因此,file_info.st_ctim.tv_sec和file_info.st_mode具有有效值。

如果您查看libssh2_scp_recv,http://libssh2.sourceforge.net/doc/#libssh2scprecv的libssh2 API文檔,它並不保證將填充file_info的所有字段。

文件的結尾由libssh2_channel_read返回的單個NULL(0)字節表示。