将二进制文件复制到C++中的远程位置



我正在尝试将本地机器上的hdf5二进制文件复制到远程计算刀片。在Qt应用程序生成所需的目录或文件后,我使用libssh将其复制出来。使用libssh,我可以打开ssh_session,对其进行身份验证,打开通道并发送远程命令。

for (QStringList::iterator it = ipList.begin(); it != ipList.end(); ++it)
{
ssh_session my_session = new ssh_new();
QString ip_address = *it;
ssh_options_set(my_session, SSH_OPTIONS_HOST, ip_address.toStdString().c_str());
// Connect...Authenticate using public key....
QString command = QString("rm -r %2; cp -r %1 %1; cp /local/file.txt /remote/file.txt").arg(local_dir, remote_dir);
execute_remote_command(my_session, command.toStdString().c_str());
// Open channel and execute command
ssh_disconnect(my_session);
ssh_free(my_session);
}

正在为每个单独的计算刀片执行此命令。在每次调用之间,我将关闭和打开一个到下一个刀片的ssh会话。这些文件显示出刀片,但它们似乎已损坏。它们的文件大小完全相同。我还没有找到一种方法来比较各个字节,看看它们有多坏,任何提示都将不胜感激。

当我在一个单独的测试终端程序中运行ssh复制命令时,这些文件似乎使它完好无损,并且在刀片上可读。该问题似乎只在文件从Qt GUI程序中移动时发生。

编辑:因此,深入研究一下问题所在,远程服务器上的文件大小似乎不一样。它似乎缺少大部分字节。最重要的是,当我逐字节检查文件的本地版本时,几乎所有的字节都不同。

事实证明,在调用SSH命令之前,HDF5编写器没有正确关闭。我通过动态分配别人编写的自定义H5类解决了这个问题,并确保在调用SSH命令之前将其删除。事实证明,编写HDF5读写类的人没有正确处理文件打开和关闭,也没有提供这样做的功能

下面是我所说的一个例子。

HDF5writer_class *hdf5_writer = new HDF5writer_class();
hdf5_writer->create_file("/local/machine/hdf5_file.h5");
// ... add the data to the file
delete hdf5_writer;
// Open SSH Session and run the copy commands

长话短说,在你试图复制之前,确保你正在写的文件已经关闭并释放以供使用。

最新更新