static inline void process_send(struct poller_st *e,wpacket_t wpk) { asynsock_t d = cast_2_asynsock(CAST_2_SOCK(MSG_IDENT(wpk))); if(d) { send_packet(d->c,wpk); asynsock_release(d); }else wpk_destroy(&wpk);//连接已失效丢弃wpk }
int32_t agent_processpacket(msgdisp_t disp,rpacket_t rpk) { uint16_t cmd = rpk_peek_uint16(rpk); if(cmd == CMD_PLY_CONNECTING) { //绑定到asynnet service->msgdisp->bind(service->msgdisp,0,sock,0,30*1000,0);//由系统选择poller }else { if(cmd >= CMD_CLIENT2GATE && cmd < CMD_CLIENT2GATE_END){ rpk_read_uint16(rpk);//丢掉命令码 }else if(cmd >= CMD_GAME2CLIENT && cmd < CMD_GAME2CLIENT_END){ uint16_t size = reverse_read_uint16(rpk);//这个包需要发给多少个客户端 //在栈上创建一个rpacket_t用于读取需要广播的客户端 rpacket_t r = rpk_create_skip(rpk,size*sizeof(agentsession)+sizeof(size)); //将rpk中用于广播的信息丢掉 rpk_dropback(rpk,size*sizeof(agentsession)+sizeof(size)); int i = 0; wpacket_t wpk = wpk_create_by_rpacket(rpk); //发送给所有需要接收的客户端 for( ; i < size; ++i) { agentsession session; session.data = rpk_read_uint32(r); agentplayer_t ply = get_agentplayer(service,session); if(ply) asyn_send(ply->con,wpk); } rpk_destroy(&r); }else{ agentservice_t service = get_thd_agentservice(); sock_ident sock = CAST_2_SOCK(sender); agentsession session; session.data = (uint32_t)asynsock_get_ud(sock); agentplayer_t ply = get_agentplayer(service,session); if(ply && ply->status == agent_playing) { //转发到gameserver send2game(wpk_create_by_rpacket(rpk)); } } } return 1; }
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 process_msg(struct poller_st *n,msg_t msg) { if(msg->type == MSG_BIND) { //printf("MSG_BIND\n"); asynsock_t d = cast_2_asynsock(CAST_2_SOCK(msg->_ident)); if(d){ struct connection *c = d->c; socket_t s = get_socket_wrapper(c->socket); if(!s->engine){ struct msg_bind *_msgbind = (struct msg_bind*)msg; c->raw = _msgbind->raw; if(0 != n->netpoller->bind(n->netpoller,c,asyncb_process_packet,asyncb_disconnect, _msgbind->recv_timeout, _msgbind->recv_timeout ? asyncb_io_timeout:NULL, _msgbind->send_timeout, _msgbind->send_timeout ? asyncb_io_timeout:NULL)) { //绑定出错,直接关闭连接 asyncb_disconnect(c,0); }else{ d->sndque = n->mq_in; //通知逻辑绑定成功 struct msg_connection *tmsg = calloc(1,sizeof(*tmsg)); tmsg->base._ident = TO_IDENT(d->sident); tmsg->base.type = MSG_ONCONNECTED; get_addr_remote(d->sident,tmsg->ip,32); get_port_remote(d->sident,&tmsg->port); if(0 != msgque_put_immeda(d->que,(lnode*)tmsg)) free(tmsg); } } asynsock_release(d); } }else if(msg->type == MSG_CONNECT) { struct msg_connect *_msg = (struct msg_connect*)msg; if(0 != n->netpoller->connect(n->netpoller,_msg->ip,_msg->port,MSG_USRPTR(_msg),asyncb_connect,_msg->timeout)) { //connect失败 struct msg_connection *tmsg = calloc(1,sizeof(*tmsg)); tmsg->base.type = MSG_CONNECT_FAIL; tmsg->reason = errno; strcpy(tmsg->ip,_msg->ip); tmsg->port = _msg->port; msgque_t que = (msgque_t)MSG_USRPTR(_msg); if(0 != msgque_put_immeda(que,(lnode*)tmsg)){ free(tmsg); } } }else if(msg->type == MSG_ACTIVE_CLOSE) { asynsock_t d = cast_2_asynsock(CAST_2_SOCK(msg->_ident)); if(d){ active_close(d->c); asynsock_release(d); } } if(MSG_FN_DESTROY(msg)) MSG_FN_DESTROY(msg)((void*)msg); else free(msg); }