티스토리 뷰

개요


socket에 대해 공부하다가 이 socket을 가지고 게임을 만들어보자는 생각이 들었다. 환경이 열악해서 상용 네트워크 엔진을 사용할 수 없기도 하고 배운 내용을 정리도 할 겸 처음부터 만들어보기로 했다.


socket을 사용하는 네트워크 엔진을 만들어보자.


엔진은 c++로 작성하며, 기본적인 구성은 팩토리 패턴으로 생성할 수 있는 Packet class, 만들어진 Packet을 전송하는 Manager class 등이다.






Packet


Packet class는 기본적으로 함수 ID, parameter의 크기, parameter set의 갯수를 int형으로 가지고 있다.

함수의 parameter들은 문자열 형태로 저장함으로써 여러 종류의 parameter에 대응할 수 있도록 추상화시킨다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Packet.h
 
class Packet{
private:
    int _func; // 함수 ID
    int _count; // parameter set의 갯수
    int _size; // parameter 문자열의 길이
    char _param[50];
 
public:
    Packet();
 
    void SetFunc(int);
    void SetCount(int);
    void SetSize(int);
    void SetParam(const char*);
 
    int GetFunc();
    int GetCount();
    int GetSize();
    const char* GetParam();
 
};
 
cs


Get, Set 함수들은 ntohl(), htonl() 함수로 바이트 오더를 적절히 바꿔준다. 결과적으로 사용자는 바이트 순서를 신경쓰지 않고, 변수값을 수정할 수 있다.


1
2
3
4
5
6
7
void SetFunc(int func){
    _func = htonl(func);
}
 
int GetFunc(){
    return ntohl(_func);
}
cs


Packet class는 용도에 따라 커스텀 하여 네트워크 매니저에게 넘겨주기만 하면 된다.

예를 들어 아래 코드는 상대 peer에게 1001번으로 매핑된 함수 Move를 호출하게 하는 패킷을 보낸다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void func(){
    // ...
    Packet packet;
    packet.SetFunc(1001); // 또는 int형 으로 맵핑된 enum, define된 값 등을 사용해도 된다.
    packet.SetCount(1);
    packet.SetParam("enemy 5 10");
    NetworkManager::Instance()->SendPacket(packet); // NetworkManager(가칭)에게 Packet을 넘겨주어 전송하게 한다.
}
 
// 1001번으로 맵핑된 함수 Move
void Move(char* name, int x, int y){
    Sprite* node = SpritePool::Instance()->GetSpriteByName(name);
    node->SetPosition(x, y);
}
 
cs







마침


Packet class는 엔진에서 비교적 작은 부분이라서 간단하게 구현할 수 있다. 

한번 쓰고 버려질 자료형이기 때문에 만들때 지역변수로 사용하면 된다.

* 지역변수로 여러군데(수십~수백 군데)에서 사용하는 것 vs 싱글톤으로 메모리를 최초에 한 번 할당하고 그때그때 변형시켜 사용하는 것. 

  어떤게 더 좋은 방법일까?


필요에 따라 Packet class를 상속받는 custumPacket class를 만들어서 사용할 수도 있다. 

* 그럼 받는 쪽에서 어떤 packet class인지 모르니까 패킷 맨 처음에 무슨 packet class인지 알려주는 플래그를 추가해야 하나?


다음 포스팅에서는 NetworkManager를 만드는 방법에 대해 설명하겠다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함