2

今、サーバー (Linux) からホスト (Windows) にファイルをダウンロードしようとしています。うまく機能しているように見えますが(他の機能)、サーバーからファイルを読み込もうとしているときです。ファイル内のデータが正しくありません。

例) サーバー テキスト ファイル:

A
B
C
D
E

ファイルの読み取りとバッファへの保存:

A
B
C

小さなサイズのテキストファイルを確認しました。うまく機能していました。ただ、テキストファイルが以前より大きくなってしまい困っています。

これが私のコードです。

int scp_receive(ssh_session session)
{
    ssh_scp scp;
    int rc;
    int size, mode;
    char *filename;
    char *buffer;
    int fd;


    scp = ssh_scp_new(session, SSH_SCP_READ, "/home/abc/27");


    if (scp == NULL)
    {
        fprintf(stderr, "Error allocating scp session: %s\n",
                                   ssh_get_error(session));    return SSH_ERROR;
    }
    rc = ssh_scp_init(scp);
    if (rc != SSH_OK)
    {
        fprintf(stderr, "Error initializing scp session: %s\n",ssh_get_error(session));
        ssh_scp_free(scp);
        return rc;
    }


    rc = ssh_scp_pull_request(scp);

    if (rc != SSH_SCP_REQUEST_NEWFILE)
    {
        fprintf(stderr, "Error receiving information about file: %s\n",ssh_get_error(session));
        return SSH_ERROR;
    }

    size = ssh_scp_request_get_size(scp);
    std::cout << "size is:" << size << std::endl;
    filename = strdup(ssh_scp_request_get_filename(scp));
    mode = ssh_scp_request_get_permissions(scp);
    printf("Receiving file %s, size %d, permisssions 0%o\n", filename, size, mode);
    free(filename);
    buffer = (char *)malloc(sizeof(char)*size);

    if (buffer == NULL)
    {
        fprintf(stderr, "Memory allocation error\n");
        return SSH_ERROR;
    }
    ssh_scp_accept_request(scp);
    rc = ssh_scp_read(scp, buffer, sizeof(char)*size);
    if(rc == SSH_ERROR)
    {
        fprintf(stderr, "Error receiving file data: %s\n", ssh_get_error(session));
        free(buffer);
        return rc;
    }
    std::cout << buffer << std::endl;
    printf("Done\n");
    //write(fd, buffer, size);

    char path[30];
    sprintf(path, "C:/Check/%s", filename);
    if (access(path, F_OK) != 0) {
       //TODO: file
        remove(path);
    }

    if(0 < (fd=open(path, O_RDWR | O_CREAT | O_TRUNC, mode)))
    {
        write(fd, buffer, sizeof(char)*size);
        close(fd);
    }
    else
    {
        std::cerr << "failed to open" << std::endl;
    }
    free(buffer);
    //rc = ssh_scp_pull_request(scp);
    //if(rc != SSH_SCP_REQUEST_EOF)
    //{
    //    fprintf(stderr, "Unexpected request: %s\n",ssh_get_error(session));
    //    return SSH_ERROR;
    //}



    ssh_scp_close(scp);
    ssh_scp_free(scp);
    return SSH_OK;
}
4

1 に答える 1

1

ここでの問題は、libssh 読み取り機能にあります。一度に最大 65536 バイトしか読み取れません。そのブロック サイズより大きいものは読み取られません。

ここでlibssh SCP 読み取り関数を見てみると:

サイズが 65536 に制限されていることがわかります。

解決策 アプリケーションでは、大きなテキスト ファイルの読み取りが完了するまで、複数の小さなメモリ チャンクの読み取りを試行する必要があります。大きなテキスト ファイルのサイズがあるので、これはループを介して簡単に実行できます。

これが遅い答えであることは知っていますが、これがこの問題を抱えている他の誰かに役立つことを願っています.

于 2013-08-28T19:35:13.063 に答える