Aug 21

最近一个 C/C++ 项目要用到 JSON, 所以选用了 json-c 库. C 语言不像 PHP/Python 等动态语言, 可以无缝地将 JSON 数据结构转为自身的数据结构, 所以操作起来会有些麻烦.

首先是数据结构. 在 json-c 里, 所有的 JSON 数据结构都是 json_object 类型, 然后这个 json_object 结构有一个 type 字段, 表明当前的对象是什么类型, 比如整数, 数组, 字符串等等. 没错, 大多数动态语言都是用类似的方法处理动态类型.

json-c 有自己的引用计数的内存管理机制, json_object_get() 函数用于手动地增加对象的引用计数, 相对地, json_object_put() 用于手动地减少引用计数. 要使用 json-c 必须非常明白每一个函数, 是否会增加或者减少对象的引用计数, 以避免内存泄露.

Continue reading »

Written by ideawu at 2010-08-21 21:45:56

Jul 16

“因为TCP端口号是16位无符号整数, 最大65535, 所以一台服务器最多支持65536个TCP socket连接.” – 一个非常经典的误解! 即使是有多年网络编程经验的人, 也会持有这个错误结论.

要戳破这个错误结论, 可以从理论和实践两方面来.

理论

系统通过一个四元组来唯一标识一条TCP连接. 这个四元组的结构是{local ip, local port, remote ip, remote port}, 对于IPv4, 系统理论上最多可以管理2^(32+16+32+16), 2的96次方个连接. 如果不仅仅考虑TCP, 则是一个五元组, 加上协议号(TCP, UDP或者其它). Continue reading »

Written by ideawu at 2010-07-16 16:44:50

Jun 11

从本篇文章开始, 我将写一序列游戏开发的文章, 讲述做一个连连看游戏的例子, 既锻炼自己, 也帮助别人. 最终, 游戏会加上网络功能.

连连看算法

如图, 为了找出A, B两点之间的连接路径, 首先过这两点作4条线段, 线段的两端便是地图边缘, 两条与横坐标轴平行, 另两条与纵坐标轴平行. 先考虑与横坐标轴平行的两条.

在两条线段上各取一点C和D, 此两点处在一条与纵坐标轴平行的直线上. 那么, ACDB这条路径便是一条可能的A, B两点的连通路径.

Continue reading »

Written by ideawu at 2010-06-11 17:01:13

Oct 12

这似乎是一个非常简单的话题, 就跟”是个人就能做网站”一样, 你可能也认为”是个人就能写使用TCP socket的网络程序”. 不过, 下面介绍的几个基本的原理的做法, 你可能并没有理解.

TCP是一种流式的协议, 简单的说, TCP不检查数据的语义, 更不会检查数据的边界. 而应用层一般使用的是报文协议. 为此, 产生了一些特定的用法和模式.

有几种方式可用来实现报文协议:

1. 明确声明报文数据的长度.
2. 使用分隔符.
3. 发送方发送完数据后关闭连接.

第3种是socket的特定用法.

Continue reading »

Written by ideawu at 2009-10-12 15:15:52

Aug 22

宏很有用, 小心别上瘾.

1. Stringification, 把参数作为C字符串, “#”.

#define M(a) #a

M(hello) => “hello”

2. Concatenation, 字面替换和拼接, “##”.

#define M(a) a ## _b

M(hello) => hello_b

## 两边可以放空白字符和注释.

参考: Red Hat Enterprise Linux 3: Using cpp, the C Preprocessor

Written by ideawu at 2009-08-22 13:47:33

Jun 25

fdevent是一套方便的跨平台IO多路复用C语言接口, 主要想法来自 epoll 和 lighttpd 的 fdevent, 接口的使用几乎和 epoll 一样.

示例

while(1) {
    nfds = fdevents_wait(evs, 1000);
    if(nfds == 0){
        //printf("timeout\n");
        continue;
    }

    for(i = 0; i < nfds; i++) {
        fde = evs->events[i];

        if(fde->flags & FDEVENT_IN){
            // ...
        }

        if(fde->flags & FDEVENT_OUT){
            // ...
        }
    }
}

项目主页: http://www.ideawu.net/person/fdevent/

Written by ideawu at 2009-06-25 16:21:28