• 2014-05-12

    小心 int 乘法溢出!

    Views: 12375 | 2 Comments

    C/C++ 语言里, 绝大部分平台上 int 类型是 32 位的, 无论你的操作系统是否是 64 位的. 而一些常用的函数, 如 malloc(), 它接受的参数是 size_t 类型:

    void *  malloc ( size_t size );
    

    如果你写出这样的代码:

    int mb = 3000; // 3000MB ~= 3GB
    void *p = malloc(mb * 1024 * 1024); // WRONG!
    

    这是非常危险的, 因为那个乘法得到的结果也是 int 类型, 但已经溢出了, 所以

    mb * 1024 * 1024 = -1073741824;
    

    然后

    malloc(-1073741824) = malloc((size_t)-1073741824);
    

    在 64 位系统里, size_t 是 64 位正整数, 所以

    (size_t)-1073741824 = 18446744072635809792
    

    相当于你试图分配那么多内存! 远远超出你的相像. 我在 SSDB 项目里就踩到过几次这种坑! 所以, 记住

    小心乘法运算!

    Posted by ideawu at 2014-05-12 23:52:47
  • 2014-05-09

    热烈庆祝icomet成为oschina推荐项目!

    Views: 33566 | 4 Comments

    最近, icomet 项目成为了 oschina 的推荐级项目!

    同时, icomet 更新了聊天 demo(立即试用):

    • 美化界面, 更好看了.
    • 增加好友列表, 能显示全部好友和最近联系人.
    • 离线存储消息.

    这个 demo 同时支持 Web 端和手机端, 使用 SSDB 作为持久化存储服务, 存储好友列表, 最近联系人和消息历史. 对于想开发跨终端 IM 的同学, 这个项目的代码值得你常常.

    icomet 项目主页: https://github.com/ideawu/icomet
    icomet-demo: https://github.com/ideawu/icomet-demos
    SSDB: https://github.com/ideawu/ssdb

    Posted by ideawu at 2014-05-09 23:01:03 Tags: ,
  • 2014-04-20

    为什么iComet比nginx-push-stream-module更好?

    Views: 24899 | 9 Comments

    有些项目需要使用"Web服务器推(comet)技术时, 便因为 Web Server 用的是 Nginx 便选择了 nginx-push-stream-module, 但是根据我们的使用经验, nginx-push-stream-module 非常坑, 只适合同时在线几千人的小网站使用. 下面对比 iComet 服务器和 nginx-push-stream-module:

    1. 安全和验证问题

    nginx-push-stream-module 本身没有安全验证机制, 客户端和浏览器可以随意订阅任意通道(channel). 如果想加入验证, 就要使用 nginx + lua 了, 一般的模式是通过 HTTP 访问其它的接口进行验证.

    相比较而言, iComet 自带了 token 验证机制, token 通过业务服务器来分配, 业务服务器可以进行业务相关的权限验证, 如账号密码, 好友关系等等. 一旦 token 生成之后, 验证过程不需要依赖第三方, 全部在 iComet 内部, 所以速度非常快.

    Continue reading »

    Posted by ideawu at 2014-04-20 20:49:05 Tags:
  • 2014-04-15

    iComet 0.2.2.1 稳定版发布和Android聊天App示例

    Views: 26566 | 2 Comments

    这个版本主要是修复了内存泄露的 BUG, 让 icomet 的内存占用更少了,
    在之前这篇博客里介绍. 对于一个 1 万并发连接的应用, 只需要占用不到 20M 的内存.

    Continue reading »

    Posted by ideawu at 2014-04-15 09:58:58 Tags:
  • 2014-04-12

    Libevent HTTP 内存泄露

    Views: 33825 | 3 Comments

    支持百万并发连接的 comet 推送服务器 icomet 刚刚修复了一个内存泄露的 bug, 这个 bug 是因为不正确地使用 libevent 导致的, 无法用 valgrind 等工具检查出来.

    这个 bug 的原因是这样的, 当客户端请求到来时, 服务器端调用了

    evhttp_send_reply_start();
    

    表示开始向客户端推送数据(使用 HTTP chunked), 最后当 long-polling 结束时, 应该调用

    evhttp_send_reply_end();
    

    来关闭连接, 释放 libevent 的内存. 不过, 如果客户端提前终止了请求, 会导致什么呢? 会导致连接关闭的回调函数 evhttp_connection_set_closecb() 被调用, 但是, 在这个回调函数里, 我没有调用 evhttp_send_reply_end(), 所以导致了内存泄露.

    在使用 libevent 的过程中, 发现 libevent 的坑确实不少, 而且它的文档根本没有对类似的地方做特别说明, 没有说明哪些函数必须配对使用, 如何释放内存等.

    Posted by ideawu at 2014-04-12 12:11:44 Tags: ,
  • 2014-04-05

    iComet 的一个应用场景

    Views: 28192 | 10 Comments

    iComet 是我做的另一个开源项目, 已经有不少朋友将 iComet 应用到了 Web IM, 移动 App 等应用的线上生产环境, 前几天还有一位朋友帮忙开发并开源了 iComet 的 Java/Android SDK.

    最近在做一个手机端 App 与桌面 PC 程序联动的项目, 简单来说, 这个软件就是要在手机上进行操作, 并立即根据操作的结果更新 PC 上的程序的响应. 例如在手机上点击了一个按钮, 就要在 PC 上自动打开某个窗口. 其中一个重要的步骤便是从服务器下发指令给 PC 上的应用程序.

    Continue reading »

    Posted by ideawu at 2014-04-05 01:57:00 Tags:
|<<<123456789>>>| 3/12 Pages, 71 Results.