코드의 확장이 제대로 된 예제가 전혀 없어서,
내 입맛에 맞게끔 수정을 가해서 쓰고 있다.
매우 간단하지만, 상당히 잘 동작하는 편이여서 마음에 든다.
소스가 다 나열하기에는 조금 길어서 5~6 번 정도에 나누어서 올릴 계획.
첫번째는 기본이 되는 packet structure 정의.
주요 특징:
- boost::asio network library 에서 사용하기 불편한 점을 보완.
- 각 socket 마다 꽤나 큰 read / write buffer 를 들고 있음.
- buffer 구조가 매우 단순하므로 mmo 에 당장 사용하기에는 무리가 있음.
- 현재 잘 동작하고 있지만, buffer 에 문제가 생기면 allocator 를 도입할 에정.
- client 연결이 많고 mmo 처럼 패킷 받은 후에 처리해야할 양이 많은 경우, packet parse 용 thread 를 따로 만들어서 동작시키는 것이 당연함!
- callback 을 boost::function 을 사용해서 좀 세련되게 하고 싶었으나, object 를 넘기는 과정에서 계속 complie error 가 발생.
- 시간관계상 그냥 C style callback 유지. 귀찮아서 다시 function 작업은 안해봤음. :)
structure.h
#include
#include
#include
#include
struct packet_header
{
unsigned short index_;
unsigned short body_length_;
packet_header() : index_(0), body_length_(0) {}
};
struct packet : public packet_header
{
char* data_;
packet() : data_(0) {}
~packet() { if(data_) delete [] data_; }
};
const int header_size = (int)sizeof(packet_header);
const int max_body_size = 1024; // If you need more size, just edit this!!!
const int max_packet_size = header_size + max_body_size;
struct data_buffer
{
boost::arraydata_;
};
typedef boost::shared_ptrpacket_header_ptr;
typedef boost::shared_ptrpacket_ptr;
typedef boost::shared_ptrdata_buffer_ptr;
No comments:
Post a Comment