kendynet을 사용하여 게이트웨이 서비스 작성

7280 단어 net
네트워크 게임 서버는 대부분 네트워크 인터페이스 서비스를 제공하여 사용자와 내부 서버 그룹 간의 통신 에이전트로 사용한다.게이트웨이 서비스는 클라이언트에서 정확한 내부 서버로 사용자 메시지를 나누어 줍니다.
다른 한편, 내부 서버에서 온 데이터 패키지를 클라이언트에게 전달합니다.일반적으로 인터넷 인터페이스 응용에 있어서 압력이 가장 큰 것은 방송 서비스다.한 사용자의 게임에서 발생하는 행동 메시지
그를 볼 수 있는 다른 플레이어 수백 명에게 방송을 해야 할지도 모른다.다음에kendynet으로 간단한 스위치 서비스를 작성합니다. 물론 이것은 예시 프로그램일 뿐입니다. 이것은 단지 하나의
연결된 데이터를 다른 연결로 보냅니다.실제 인터넷 게임의 게이트웨이 서비스는 훨씬 복잡하다.
우선 기본 디자인을 소개하고,
static msgdisp_t  disp_to_server;
static msgdisp_t  disp_to_client;
sock_ident        to_server;

먼저 두 개의 메시지 프로세서를 정의합니다. 한 사용자가 사용한 메시지를 처리하고, 한 사용자가 내부 서버에서 온 메시지를 처리합니다.
그다음에 sock_ident, 내부 서버와의 연결을 나타냅니다.
다음 main 함수에서 다음을 수행합니다.
    asynnet_t asynet = asynnet_new(3);//3 poller,1 ,1 ,1 
    msgdisp_t  disp_to_server = new_msgdisp(asynet,
                                  to_server_connect,
                                  to_server_connected,
                                  NULL,
                                  to_server_process,
                                  NULL);

    msgdisp_t  disp_to_client = new_msgdisp(asynet,
                                  to_client_connect,
                                  NULL,
                                  NULL,
                                  to_client_process,
                                  NULL);

    thread_t service1 = create_thread(THREAD_JOINABLE);
    thread_t service2 = create_thread(THREAD_JOINABLE);

    to_client_ip = argv[1];
    to_client_port = atoi(argv[2]);


    to_server_ip = argv[3];
    to_server_port = atoi(argv[4]);

    thread_start_run(service1,service_toserver,(void*)disp_to_server);
    sleepms(1000);
    thread_start_run(service2,service_toclient,(void*)disp_to_client);

먼저 비동기 네트워크 엔진을 만들고 매개 변수 3을 전송합니다. 이것은 3개의poller를 만드는 것을 나타냅니다. 그 중에서 첫 번째는 감청 세트 인터페이스를 처리하는 데 사용되고, 두 번째는 내부 서버와
의 연결, 세 번째 사용자 처리와 클라이언트의 연결.
이어서 서로 다른 메시지 리셋 함수로 두 개의 메시지 서비스를 만듭니다.
마지막으로 두 개의 단독 라인을 만들어서 각각 두 개의 메시지 서비스를 실행합니다.
다음으로 콜백 서비스의 처리를 살펴보겠습니다.
void to_server_connected(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port,uint32_t err)
{
    to_server = sock;
}


int32_t to_client_process(msgdisp_t disp,sock_ident sock,rpacket_t rpk)
{
    if(!eq_sockident(sock,to_server)){
        //from cliet,send to server
        push_msg(disp_to_server,(msg_t)rpk);
    }else
    {
        //from server,send to client
        sock_ident client = read_from_rpacket(rpk);
        asyn_send(client,wpk_create_by_other((struct packet*)rpk));
    }
    return 1;
}

void to_client_connect(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port)
{
    // 3 poller 
    disp->bind(disp,3,sock,1,3*1000,0);
}


int32_t to_server_process(msgdisp_t disp,sock_ident sock,rpacket_t rpk)
{
    if(!eq_sockident(sock,to_server)){
        //from cliet,send to server
        asyn_send(to_server,wpk_create_by_other((struct packet*)rpk));
    }else{
        //from server,send to client
        push_msg(disp_to_client,(msg_t)rpk);
    }
    return 1;
}

void to_server_connect(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port)
{
    // poller 
    disp->bind(disp,2,sock,1,3*1000,0);
}

우선 두 개의connect 리셋을 주의하십시오. 서버에 대해서는 2번poller로, 클라이언트에 대해서는 3번poller로 연결합니다.
그리고 두 개의 프로세스 함수를 다시 보십시오.클라이언트의process 함수에 대해 말하자면, 패키지의 인터페이스가 to_가 아닌 것을 발견하면서버, 데이터 패키지
disp_에게 보내기to_server, disp_to_서버는 이 데이터 패키지를 내부 서비스에 보냅니다.패키지가 to_에서 온 것을 발견하면server,
그러면 데이터 패키지에서 전송 목표를 읽고 데이터 패키지를 대상 클라이언트에게 보냅니다.
서버의 프로세스 함수는 정반대입니다. to_disp_에 서버 메시지 보내기to_client.클라이언트로부터 to_server
보내다.간단한 메시지 전달 서비스가 이렇게 실현되었다.
전체 예제 프로그램은 다음을 참조할 수 있습니다.
https://github.com/sniperHW/luanet/blob/master/kendynet/test/gateservice.c
 
 

좋은 웹페이지 즐겨찾기