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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HTTP Request in TCP파이썬으로 개발된 OCR 서버와 TCP로 이미지 데이터를 http 형식으로 전송하는 방법을 알아내기 위해, Node.js 의 내장 모듈 을 사용했다. 설명 http는 Content-Type에 따라 Body의 구조가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.