ejabberd的编译,代码解读.
     在对erlang这个语言有些了解这后,我有些自已写点代码的想法,
     但想想c++之父说的,不重新造一个车轮。
     我决定用ejabberd来玩玩。
     ejabberd是一个erlang实现的xmpp服务器。什么是xmpp呢?jabber协议中最主要的部分。
     xml通过stream的形式进行通迅,定义的im交互。
     ejabberd有部分代码采用c 接口的方式实现。
     主要在于xml解析,以及ssl,ut8f,zip stream这几个。
     这几个gnu的最好的解决方案主要是 expat(xml),iconv(utf8), zlib(zip),ssl(openssl).
     所以在对ejabberd之前先要安装上面讲的几个开发包。
     ejabberd是一个比较linux的程序,先是要configure ,然后再make,make install
     在windows下不存在configure,所以有configure.bat代替,make然后nmake -f makefile.win32
     在configure.bat之后,生成makefile.inc
如果你安装的那几个库和我的一个位置,就改成我这样.
ERLANG_VERSION = 5.6.5
EI_DIR = c:/PROGRA~1/ERL56~1.5/lib/erl_interface-3.5.9
ERLANG_DIR = c:/PROGRA~1/ERL56~1.5
EJABBERD_VERSION = 2.1.0-alpha
SSLDIR = c:/PROGRA~1/ERL56~1.5/lib/ssl-3.10
STDLIBDIR = c:/PROGRA~1/ERL56~1.5/lib/stdlib-1.15.5
OPENSSL_DIR = D:\workspace\sdk\openssl-0.9.8a.win32
DBTYPE = generic
EXPAT_DIR = C:\Program Files\Expat 2.0.1
EXPAT_LIB = $(EXPAT_DIR)\Bin\libexpat.lib
ICONV_DIR = D:\workspace\sdk\iconv-1.9.2.win32
ICONV_LIB = $(ICONV_DIR)\lib\iconv.lib
ZLIB_DIR = D:\workspace\sdk\zlib-1.2.3.win32
ZLIB_LIB = $(ZLIB_DIR)\lib\zlib.lib
在编译的过程中还会出现lib找不到的,你就到相应的makefile里面改成对应的lib好了。
 
ejabberd的工程主要通过ejabberd.app 组织起来
ejabberd.erl :
application:start(ejabberd).
ejabberd_app.erl:
     Mod:start(); 
ejabberd_listener.erl
     通过 conf 得到ejabberd_c2s,
    开始listen
    如果有连接,accpet之后
ejabberd_socket:start(Module, gen_tcp, Socket, Opts)
 Receiver = ejabberd_receiver:start(Socket, SockMod, none, MaxStanzaSize),
case Module:start({?MODULE, SocketData}, Opts) of
                {ok, Pid} ->
                    case SockMod:controlling_process(Socket, Receiver) of
                        ok ->
                            ok;
                        {error, _Reason} ->
                            SockMod:close(Socket)
                    end,
                    ejabberd_receiver:become_controller(Receiver, Pid);
                {error, _Reason} ->
                    SockMod:close(Socket)
ejabberd_receiver中将xml_stream和c2s关联起来.
receiver收到数据发送到xml_stream.
xml_stream解析数据后发送到c2s状态机.
c2s实际上就是一个gen_fsm的状态机。
根据xml_stream的情况解析jabber xmpp协议。
ejabberd官方文档中提到的那些关于xmpp收到的事件的hook,就是在c2s中实现的。
c2s中调用ejabberd_hooks:run_fold()来运行相就的hook。
 
ejabberd中的mod实际上是一ejabberd作者实现的一个behaviour,如同gen_server这些的实现。
这玩意有点像java中的接口,其他模块就是要实现在gen_mod中的回调函数,就可以作为一个mod来使用。
 
     呵呵,整个工程就是这样。
 来自:http://l-xiao187.spaces.live.com/blog/cns!A3D10938CA0EE91D!286.entry