美文网首页
lsquic 发送大文件

lsquic 发送大文件

作者: 自由侠 | 来源:发表于2021-03-23 16:48 被阅读0次

背景:

         lsquic官方demo提供一个发送单个消息的示例.

         本文介绍基于lsquic api(准确来说是回调函数)发送大文件.

发送大文件和发送单条消息的区别?

        发送单条消息不用考虑流控. 而发送大文件需要考虑发送缓冲区满的情况.

发送大文件的实现:

        和发送单条消息一样, 发送大文件的逻辑也是在 on_write回调函数里边.

       简单处理逻辑如下:

nw = lsquic_stream_writef(stream, &reader);

    if (nw > 0)

    {

        LOG("write bytes: %d\n", nw);

    } else if (0 == nw) {

        LOG("write bytes: %d\n", nw);

        tut->tut_u.c.stream = stream;

        ev_timer_stop(tut->tut_loop, &tut->tut_timer_delaysend);

        ev_timer_init(&tut->tut_timer, tut_timer_delaysend, 1000, 0.);

        ev_timer_start(tut->tut_loop, &tut->tut_timer_delaysend);

        lsquic_stream_flush(stream);

        lsquic_stream_wantwrite(stream, 0);

    }

static void

tut_timer_delaysend (EV_P_ ev_timer *timer, int revents)

{

    struct tut *const tut = timer->data;

    LOG("delay send\n");

    lsquic_stream_wantwrite(tut->tut_u.c.stream, 1);

}

注意事项:

        如何判断缓冲区已满?

        lsquic_stream_write 返回0的时候缓冲区是满的.

        缓冲区满了如何处理?

        本文简单处理逻辑是暂定发送, 调用lsquic_stream_wantwrite(stream, 0); 暂停写逻辑,  等待底层发送, 同时启动一个稍后发送的定时器, 定时器的逻辑很简单, 调用lsquic_stream_wantwrite(stream, 1)继续处理应用层发送逻辑. 

       如果不暂停写, 上层会一直有写事件传给事件调度器, 底层处理不及时的情况. 导致程序报warnning. 

        如何判断所有数据是否发送完毕?

相关文章

  • lsquic 发送大文件

    背景: lsquic官方demo提供一个发送单个消息的示例. 本文介绍基于lsquic api(准...

  • 发送大文件

    QQ邮箱:只能够发送 3GB 一下的文件至任意邮箱上传的文件保存30天上传速度约为 2~3 Mb/s(测试机的最大...

  • vite项目中无法使用minio的解决方案

    问题背景项目需要上传大文件,既然是大文件,如果一次性进行读取发送、接收都是不可取的,很容易导致内存问题。所以对于大...

  • WebSocket 与 Socket

    Context 需要使用ASP.NET的SignalR库,配合NATS和Redis实现大文件向前端的推送。文件发送...

  • 网络

    基础 默认情况下不能传输中文数据,设置编码转换 发送JSON给服务器 网络状态 随时监听 大文件节省内存下载 每次...

  • Android高手笔记 - IO优化

    IO 优化不就是不在主线程读写大文件吗,真的只有这么简单吗? IO 基础 IO流程:应用程序 发送逻辑IO命令给文...

  • 管道

    以传统读写流方式复制大文件 以管道形式复制大文件 大文件压缩(链式流)

  • 多线程的使用场景

    什么时候使用多线程 场景1:批量处理任务 向大量(100w以上)的用户发送邮件处理大批量文件处理大文件时,文件分段...

  • 没网怎么互传文件?这份点传使用指南一定要看

    当你给朋友发送手机资料,发现传输速度逐渐变成了10kb/s;当你想近距离分享大文件给同事时,过了很久,进度条仿佛也...

  • 解决GitHub不能上传大文件问题

    向 GitHub push 大文件时报错,可以在推送时,忽略这个大文件,忽略大文件的步骤如下: 1.cd xx 切...

网友评论

      本文标题:lsquic 发送大文件

      本文链接:https://www.haomeiwen.com/subject/jtbfhltx.html