当前位置: 首页 > 工具软件 > Jabberd2s > 使用案例 >

Jabberd2源代码分析: client连接c2s

微生烨然
2023-12-01

客户端连接c2s

 

c2s调用mio_listen后,处于监听状态,等待客户端连接。

 

client->c2s: connect->accept

客户端连接c2s服务器5222端口

 

当mio检测到处于监听状态的socket可读后,调用_mio_accept函数

void _mio_accept(mio_t m, mio_fd_t fd)

该函数中调用accept返回一个新的socket fd,将返回的fd加入到mio中,调用回调函数_c2s_client_mio_callback(action_ACCEPT)

 

int _c2s_client_mio_callback(mio_action_t = action_ACCEPT)

在action_ACCEPT中:

创建一个sess_t,用于保存客户端的信息。获取到客户端的IP端口号信息,进行必要的检测。然后调用:

sess->s = sx_new(c2s->sx_env, fd->fd, _c2s_client_sx_callback, sess);

mio_app(m, fd, _c2s_client_mio_callback, (void *) sess); 

和router通讯类似,这个_c2s_client_sx_callback函数和_c2s_client_mio_callback配合用于处理用户的IO读写等操作。

 

然后调用 xhash_put将sess插入到c2s->session中 key为client端的socket fd。

最终调用 sx_server_init(sess->s, flags)结束函数。

 

void sx_server_init(sx_t s, unsigned int flags)

函数中调用插件函数 server

设置expat解析回调函数

XML_SetElementHandler(s->expat,_sx_server_element_start,_sx_server_element_end);

XML_SetStartNamespaceDeclHandler(s->expat,_sx_server_ns_start);

设置完成后,调用_sx_event(event_WANT_READ),设置读事件.

 

 

 

至此连接建立完成,c2s服务器进入mio_run循环,等待客户端发送数据。

 类似资料: