客户端连接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循环,等待客户端发送数据。