【问题标题】:Using libssh library, I have a trouble with ssh_scp_read function使用 libssh 库,我遇到了 ssh_scp_read 函数的问题
【发布时间】:2013-05-29 03:41:34
【问题描述】:

现在我正在尝试将文件从服务器 (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;
}

【问题讨论】:

  • 我认为它可以作为非阻塞模式工作。但是,我不知道如何将非阻塞更改为阻塞模式。 T.T 我在libssh官网红了指令但是找不到...

标签: windows ssh scp libssh


【解决方案1】:

这里的问题在于 libssh 读取功能。它一次最多只能读取 65536 个字节。它不会读取任何大于该块大小的内容。

如果您在此处查看 libssh SCP 读取功能:http://xtalopt.openmolecules.net/wiki/index.fcgi/browser/src/libssh/scp.c?rev=2b0288492ad2481ee8bdbb8c1f9d5c453a044eee

您会看到大小限制为 65536。

解决方案 在您的应用程序中,您应该尝试读取多个较小的内存块,直到您完成读取大文本文件。而且由于您拥有大文本文件的大小,因此可以通过循环轻松完成。

我知道这是一个迟到的答案,但希望这可以帮助遇到此问题的其他人。

【讨论】:

  • 感谢您的回复。实际上我使用 sftp_read 函数解决了这个问题。我会尝试这种方式来解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多