패킷 송수신 코딩 중 실수를 예방하는 법

by nettadmin / 2011. 04. 29. [14:56]

넷텐션에서 타사 파견 기술지원이나 기술 영업 미팅을 나가서 개발중인 게임 소스를 보다 보면 간혹 패킷 송수신 처리를 실수하거나 관련 고생을 하는 경우를 자주 봅니다.

 

그럴만도 한게, 패킷 송수신 처리는 많은 노가다 코딩을 수반하기 때문입니다. (아래는 그 예)

// Message header ID definitions
#define Message_Knight_Move_ID 12
#define Message_Knight_Attack_ID 13// Message format definitions
struct Message
{int m_msgID;
};
struct Message_Knight_Move:public Message
{int m_id;   float m_x,m_y,m_z;
};
struct Message_Knight_Attack:public Message
{int m_id;int m_target;int m_damage;
};// A function which send a formatted message
void Knight_Move(int id,float x,float y,float z)
{Message_Knight_Move msg;msg.m_msgID=Message_Knight_Move_ID;msg.m_id=id;msg.m_x=x;msg.m_y=y;msg.m_z=z;Send(msg);
}// A function which send a formatted message
void Knight_Attack(int id,int target,int damage)
{Message_Knight_Attack msg;msg.m_msgID=Message_Knight_Attack_ID;msg.m_id=id;msg.m_target=target;msg.m_damage=damage;Send(msg);
}// Identified a received message and call an appropriate function for message handling
void DoReceivedMessage(Message* msg)
{switch(msg->m_msgID){case Message_Knight_Move_ID:{Message_Knight_Move* msg2= (Message_Knight_Move*)msg;Do_Knight_Move(msg2->m_id,msg2->m_x,msg2->m_y,msg2->m_z);}break;// ... cases for other message typescase Message_Knight_Attack_ID:{Message_Knight_Attack* msg2=(Message_Knight_Attack*)msg;Do_Knight_Attack(msg2->m_id,msg2->m_target,msg2->m_damage);}break;// ... cases for other message types}
}

코딩하는 것도 노가다이지만, 무엇보다도, 코딩하다가 행여나 실수라도 하면 찾기 힘든 버그가 되기도 합니다. 오랫동안 소스를 유지보수하다보면 저기서 실수를 하는 사람들이 꼭 있습니다. 이 글을 쓰는 이유는, 오늘도 그런 실수를 하는 케이스를 제보받았기 때문입니다. (프라우드넷 쓰는 업체는 아니었음)

 

저런 노가다 코딩을 사람 대신 기계가 자동으로 해줄 수 없을까?라는 할 수 있죠. 그리고 나온 결론은 RPC or RMI를 쓰자~! 입니다. 다행히 RPC나 RMI는 이미 Java나 Win32 등에서도 제공하지만 그것들은 게임에 쓰기에는 너무 범용적이고 불필요한 기능이 많죠. 시각을 다투는 게임 프로그램에서는 부담스럽습니다.

 

그래서 RPC 시스템을 직접 만드는 것이 좋습니다. 그렇게 하면 사람이 직접 상기 코드를 짜는 것과 처리 속도가 같습니다.

 

가령,

Knight_Move([in] int id,[in] float x,[in] float y,[in] float z);
Knight_Attack([in] int id,[in] int target,[in] int damage);

 

이렇게 선언해주면 위의 노가다 코드를 기계가 생성해주는거죠. 일도 쉬워지고, 무엇보다도 실수를 원천봉쇄합니다.

 

자체 RPC 시스템을 만드는 법은 Game Programming Gems 5에서 배현직님이 기고해 주셨습니다.

 

참고로, 프라우드넷에서도 같은 기능을 (물론 Game Programming Gems 책에 나온 것보다 앞서 있는 기능을 가진) 기능을 제공합니다.

Development Issues