TBOX提供上层高度封装的传输池来进行客户端的并发批量下载、上传、文件复制、socket数据透传等io传输需求。

    投递到transfer_pool传输池的所有任务都是异步并发处理的。如果对并发量要求不高的话,例如客户端应用,那么使用全局的tb_transfer_pool()就足够了。

    全局的transfer_pool使用了全局的tb_aicp(),并且考虑到大部分客户端应用,并发量不是很高,因此对资源需求做了些限制,一般比较适合并发量小于100的场合。

    如果需要高并发的情况,则可以通过tb_transfer_pool_init、tb_aicp_init手动创建:transfer_pool和aicp,指定aicp需要的并发量,来提高并发需求。

    如果要对每个io传输更加灵活的控制,可以直接使用async_transfer,自己上层做管理就行了。

    1. // 传输信息回调函数
    2. static tb_bool_t tb_demo_transfer_done_func(tb_size_t state, tb_hize_t offset, tb_hong_t size, tb_hize_t save, tb_size_t rate, tb_cpointer_t priv)
    3. {
    4. // 计算进度
    5. tb_size_t percent = 0;
    6. if (size > 0) percent = (tb_size_t)((offset * 100) / size);
    7. else if (state == TB_STATE_OK) percent = 100;
    8.  
    9. // 打印信息
    10. tb_trace_i("save[%s]: %llu, rate: %lu bytes/s, percent: %lu%%, state: %s", priv, save, rate, percent, tb_state_cstr(state));
    11.  
    12. // 继续下载
    13. return tb_true;
    14. }
    15.  
    16. // 投递几个http下载任务
    17. tb_transfer_pool_done(tb_transfer_pool(), "http://www.xxxx.com/file1", "/tmp/a", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    18. tb_transfer_pool_done(tb_transfer_pool(), "http://www.xxxx.com/file2", "/tmp/b", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    19.  
    20. // 投递几个https下载任务
    21. tb_transfer_pool_done(tb_transfer_pool(), "https://www.xxxx.com/file3", "/tmp/c", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    22. tb_transfer_pool_done(tb_transfer_pool(), "https://www.xxxx.com/file4", "/tmp/d", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    23.  
    24. // 投递几个文件copy任务
    25. tb_transfer_pool_done(tb_transfer_pool(), "/tmp/file1", "/tmp/e", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    26. tb_transfer_pool_done(tb_transfer_pool(), "/tmp/file2", "/tmp/f", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    27.  
    28. // 投递几个文件copy任务
    29. tb_transfer_pool_done(tb_transfer_pool(), "/tmp/file1", "/tmp/g", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    30.  
    31. // 在windows下投递文件copy任务
    32. tb_transfer_pool_done(tb_transfer_pool(), "c://xxxx/file2", "c://tmp/h", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    33.  
    34. // 投递tcp socket传输任务
    35. tb_transfer_pool_done(tb_transfer_pool(), "sock://127.0.0.1", "/tmp/i", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    36.  
    37. // 投递udp socket传输数据到其他对方tcp socket服务器上
    38. tb_transfer_pool_done(tb_transfer_pool(), "sock://127.0.0.1/?udp=", "sock://xxx.xxx.xxx.xxx", 0, 0, tb_demo_transfer_done_func, tb_null, tb_null));
    39.  
    40. /*! 投递异步io传输任务到传输池:iurl => ourl
    41. *
    42. * @param pool 传输池,默认可以使用全局的tb_transfer_pool(),也可以自己创建私有的pool
    43. * @param iurl 输入url
    44. * @param ourl 输出url
    45. * @param offset 源端开始传输的数据offset,一般只要传0就行了
    46. * @param rate 指定限速值,传0为默认无限速
    47. * @param done 传输信息回调函数,间隔1s调用一次
    48. * @param ctrl 控制参数设置回调函数,在开始传输前,对io的传输做一些参数控制
    49. * @param priv 用户传入的私有数据
    50. *
    51. * @return 投递成功:tb_true,投递失败:tb_false
    52. */
    53. tb_bool_t tb_transfer_pool_done(tb_transfer_pool_ref_t pool, tb_char_t const* iurl, tb_char_t const* ourl, tb_hize_t offset, tb_size_t rate, tb_async_transfer_done_func_t done, tb_async_transfer_ctrl_func_t ctrl, tb_cpointer_t priv);

    其中对于传输参数控制的回调函数使用,可以参考TBOX提供的spider demo程序。