コード例 #1
0
ファイル: asynnet.c プロジェクト: cjl3080434008/luanet
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
}
コード例 #2
0
ファイル: agentservice.c プロジェクト: Stan1990/KendyNet
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;
}
コード例 #3
0
ファイル: msgdisp.c プロジェクト: cjl3080434008/luanet
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);
    }
}
コード例 #4
0
ファイル: asynnet.c プロジェクト: cjl3080434008/luanet
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);
}