2016-05-27 54 views
0

我正在嘗試將本地計算機上的hdf5二進制文件複製到遠程計算刀片。我使用libssh在我的Qt應用程序生成它們之後將所需的目錄或文件複製出來。使用libssh我可以打開一個ssh_session,進行身份驗證,打開一個通道併發送遠程命令。將二進制文件複製到C++中的遠程位置

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程序中移動文件時。

編輯:如此深入探究有什麼問題,看起來遠程服務器上的文件大小不一樣。它似乎缺少大部分的字節。最重要的是,當我使用本地版本的文件逐字節地檢查什麼時,幾乎所有的字節都不相同。

+3

所以我知道我在這裏還是新手,但有人可以告訴我這個問題是什麼問題導致它落選得如此之快或改進方式?接下來沒有libssh的例子,我已經搜索了幾個星期的答案,並沒有提供任何東西。 – Wired365

+3

在您的問題目前的表格中,確實沒有辦法提供有意義的答案。請修改您的問題以包含程序中的相關源代碼。並嘗試識別傳輸文件有什麼問題 - 它們是否太短?太長?字節是否錯誤?另外,你的問題中有很多不必要的措詞。嘗試將其縮減爲與您的問題相關的內容。 – Kenster

+0

感謝您的提示,我會清理它。 – Wired365

回答

0

原來的答案是在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 

長話短說,請確保您正在編寫的文件在您嘗試複製之前關閉並釋放使用。

相關問題