基于jabberd-2.2.9做的分析,客户端用的 Psi v0.14。
网上有一些分析 jabberd2 结构的文章,具体在这就不细说。
因为我们项目目前需要修改 C2S 跟客户端的通讯协议,直接进入主题,分析从客户端收到一个包,并触发event_PACKET:
调用栈:
#0 _c2s_client_sx_callback (s=0x8098398, e=event_PACKET, data=0x80a20a0, arg=0x8099768) at c2s.c:251
#1 0x0805b236 in __sx_event (file=0x806ec3d "io.c", line=156, s=0x8098398, e=event_PACKET, data=0x80a20a0) at sx.c:328
#2 0x08059c07 in _sx_process_read (s=0x8098398, buf=0x80a18c0) at io.c:156
#3 0x0805a2c7 in sx_can_read (s=0x8098398) at io.c:243
#4 0x080516fc in _c2s_client_mio_callback (m=0x807b8e0, a=action_READ, fd=0x8099750, data=0x0, arg=0x8099768) at c2s.c:536
#5 0x08062c1e in _mio_run (m=0x807b8e0, timeout=5) at mio_impl.h:261
#6 0x08056961 in main (argc=3, argv=0xbfffea04) at main.c:732
可以看出来,mio 模块收到数据后,转给 sx,sx 再调用回调 c2sclient_sx_callback。