static void dispatch_msg(msgdisp_t disp,msg_t msg) { //printf("dispatch_msg\n"); if(msg->type == MSG_RPACKET) { //printf("RPACKET\n"); rpacket_t rpk = (rpacket_t)msg; if(!disp->process_packet || disp->process_packet(disp,make_by_ident(MSG_IDENT(rpk)),rpk)) rpk_destroy(&rpk); }else if(msg->type == MSG_DB_RESULT){ db_result_t result = (db_result_t)msg; if(result->callback) result->callback(result); free_dbresult(result); }else if(msg->type == MSG_DO_FUNCTION){ msg_do_function_t _msg = (msg_do_function_t)msg; if(_msg->fn_function) _msg->fn_function(MSG_USRPTR(_msg)); free(msg); } else{ struct msg_connection *tmsg = (struct msg_connection*)msg; //printf("dispatch_msg %d\n",msg->type); sock_ident sock = CAST_2_SOCK(tmsg->base._ident); if(msg->type == MSG_ONCONNECT){ //printf("MSG_ONCONNECT\n"); if(disp->on_connect) disp->on_connect(disp,sock,tmsg->ip,tmsg->port); else asynsock_close(sock); } else if(msg->type == MSG_ONCONNECTED){ //printf("MSG_ONCONNECTED\n"); if(disp->on_connected) disp->on_connected(disp,sock,tmsg->ip,tmsg->port); else asynsock_close(sock); } else if(msg->type == MSG_DISCONNECTED && disp->on_disconnect){ disp->on_disconnect(disp,sock,tmsg->ip,tmsg->port,tmsg->reason); } else if(msg->type == MSG_CONNECT_FAIL && disp->connect_failed) disp->connect_failed(disp,tmsg->ip,tmsg->port,tmsg->reason); free(msg); } }
static void agent_connected(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port) { agentservice_t service = get_thd_agentservice(); agentplayer_t ply = new_agentplayer(service); if(!ply) { //发送一个消息,通知系统繁忙然后关闭连接 wpacket_t wpk = wpk_create(64,0); wpk_write_uint16(wpk,CMD_GAME_BUSY); asyn_send(sock,wpk); asynsock_close(sock); }else { asynsock_set_ud(sock,(void*)ply->session.data); } }