0

我可以使用 libssh2_scp_send(). 但是,当我尝试使用 接收文件 libssh2_scp_recv()时,它不会struct stat 用数据填充参数。文件大小始终返回“0”。

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仍然是空的。

4

2 回答 2

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);
   }
}

希望这有帮助。

问候。

于 2012-08-01T21:09:55.367 回答
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) 字节指示。

于 2015-03-19T01:15:40.367 回答