2 t407289575 t407289575 于 2014.10.06 16:31 提问

急!!libssh2_channel_read()无法返回全部数据

当执行的命令返回的结果数据量较大时,libssh2_channel_read()只能读取channel的一部分,不知道怎样才能读取全部的数据。

//下面是读取channel的代码

for( ;; )
{

    libssh2_channel_receive_window_adjust(channel, LIBSSH2_CHANNEL_MINADJUST*5, 1);

    int rc1;

    do
    {
        char buffer[0x4000];
        rc1 = libssh2_channel_read( channel, buffer, sizeof(buffer) );  //读数据


        count = count + rc1; //记录输出的字节数

        if( rc1 > 0 )
        {
            result = [NSString stringWithFormat:@"%s",buffer];

        }
    }
    while( rc1 > 0 );



    /* this is due to blocking that would occur otherwise so we loop on
     this condition */
    if( rc1 == LIBSSH2_ERROR_EAGAIN )
    {
        waitsocket(sock, session);
    }
    else
        break;
}

------------------------------结果----------------------

2014-10-17 10:28:30.747 WiFiset[645:60b] ================================

28248 //本次读取字节数。(总字节数不止这个数)

2014-10-17 10:28:30.748 WiFiset[645:60b] ----- ms ago
Information elements from Probe Response frame:
SSID: WiFi1111

    Capabilities: 0x11ef


(......中间省略......)


TIM: DTIM Count 0 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0
ERP: Barker_Preamble_Mode
Extended supported rates   //“rates”后面还有很多数据

1个回答

BillyThe
BillyThe   2014.10.07 18:21

嗨,

可以多读几次
参考
http://www.libssh2.org/libssh2_channel_read_ex.html
http://blog.csdn.net/wyc6668205/article/details/9179197

这个博客写的很好

希望对你有帮助

t407289575
t407289575 每次读取的字节数都不一样,但是25000-35000之间,给我的感觉 就是,channel在一定的时间后就自动关闭了一样
3 年多之前 回复
t407289575
t407289575 网上搜到这个解决方法,可是不奏效。---------2、 遇到收集或显示特别多的数据时需要调整channel的缓存大小 我还遇到了一次在接收show tec命令的信息时,我的程序总是在中途卡主,而且每次都是同一个地方,而其他的命令就没问题,当时我就意识到可能是show tec吐出的信息数据量太大的缘故,后来我查了一下www.libssh2.org上的邮件列表之后证实了我的猜测,然后我就使用了libssh2_channel_receive_window_adjust()这个函数,每次数据量过大的时候,就调整channel的缓存,最后问题就解决了。
3 年多之前 回复
t407289575
t407289575 代码已经补出。
3 年多之前 回复
BillyThe
BillyThe 提出代码,大家一起讨论
3 年多之前 回复
t407289575
t407289575 那要怎么做,还是不明白,每次读到一个地方后面的就读不了,感觉就像channel在一定时间内关闭了一样,求助
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!