在对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来使用。
呵呵,整个工程就是这样。