• 2014-04-15

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

    Views: 24991 | 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: 31281 | 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: 26170 | 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:
  • 2014-03-14

    C++ STL 迭代器的失效原则

    Views: 11854 | No Comments

    有一段时间, 我对 STL 的容器有一些疑惑, 那便是如何快速将地将给定的元素从容器中删除. 例如 std::list 是链表, 本应支持快速的 O(1) 的删除操作, 但给定的 remove() 方法是 O(n) 成本的. 后来, 我才明白, C++ STL 的迭代器(iterator)不仅仅用来遍历容器, 它们的另一作用便是实现那些不是很直观的操作.

    先举一个 C 语言链表的例子, 节点的结构体一般这样定义:

    struct Node{
    	struct Node *prev, *next;
    	Item item;
    };
    

    Continue reading »

    Posted by ideawu at 2014-03-14 09:50:51
  • 2014-03-08

    有趣的 main 函数参数

    Views: 10102 | 6 Comments

    大家都知道, C 语言可执行程序的入口是 main 函数, main 函数的原型是这样:

    int main(int argc, char **argv);
    

    编译程序生成可执行文件后, 从命令行运行, 参数 argc 是指命令行参数的个数(包括程序本身), 而参数 argv 则是所有参数字符串.

    你有没有想过, 为什么 argv 的类型是 char**, 而不是 const char** 呢? 难道 argv 的内容也可以被修改? 没错! 命令行传过来的参数是可以被修改的. 而修改后能带来什么好处呢? 其实, 你可以通过修改 argv 来更改进程在 top/ps 中的显示. 例如, 如果你的可执行文件是 a.out, 那么你可以让它在 top/ps 显示成 abc, 也就是修改进程的名字.

    Continue reading »

    Posted by ideawu at 2014-03-08 11:35:23
  • 2014-02-15

    长连接技术的应用

    Views: 15656 | 2 Comments

    Web 技术太流行而且太强大了, 以至于我们在开发任何应用时, 都会想到利用 Web 技术. Apache, PHP, Java, HTTP, JSON, ... 只需要简单且流行的技术, 就能搭建一个系统.

    但是, 对于另一类重要的需要服务器向客户端推送数据的应用, 传统的 Web 技术就不适用了, 因为 Web 的基础网络协议 HTTP 是请求响应模式, 一旦客户端不请求, 服务器就无法将数据推送给客户端. 而如果客户端的请求太过频繁(轮询), 那么就会对服务器造成巨大的压力.

    为此, 需要有一种被称为长连接服务的技术. 长连接技术包含客户端和服务器两部分, 可以看成是传统的 Client-Server 架构. 而对应的长连接服务器, 就提供了网络连接管理和消息发送的功能. 比较有意思的是, 长连接技术也被应用到了 Web 领域, 实现所谓的"服务器推"技术, 也称 Comet 技术.

    Continue reading »

    Posted by ideawu at 2014-02-15 14:53:50 Tags:
|<<<123456789>>>| 3/12 Pages, 68 Results.