如何实现protobuf协议server?
1.继承pink::PbConn
,重载DealMessage
方法
class MyPbConn : public pink::PbConn {
public:
MyPbConn(int fd, std::string ip_port, pink::Thread* self_thread_ptr = NULL) : pink::PbConn(fd, ip_port) {
res_ = dynamic_cast<google::protobuf::Message*>(&message_);
}
~MyPbConn() {}
int DealMessage() {
message_.ParseFromArray(rbuf_ + cur_pos_ - header_len_, header_len_);
message_.set_name("hello " + message_.name());
uint32_t u =htonl( message_.ByteSize());
memcpy(static_cast<void*>(wbuf_), static_cast<void*>(&u), COMMAND_HEADER_LENGTH);
message_.SerializeToArray(wbuf_ + COMMAND_HEADER_LENGTH, PB_MAX_MESSAGE);
set_is_reply(true);
}
private:
::simple_message::SimpleMessage message_;
MyPbConn(MyPbConn&);
MyPbConn& operator=(MyPbConn&);
};
2.继承pink::WorkerThread
,设置模板参数
class MyWorkerThread : public pink::WorkerThread<MyPbConn> {
public:
MyWorkerThread(int cron_interval = 0) : pink::WorkerThread<MyPbConn>(cron_interval) {}
~MyWorkerThread() {}
private:
MyWorkerThread& operator=(MyWorkerThread&);
MyWorkerThread(MyWorkerThread&);
};
3.继承`pink::DispatchThread,设置模板参数
class MyDispatchThread : public pink::DispatchThread<MyPbConn> {
public:
MyDispatchThread(int my_port, int my_worker_threads_num, MyWorkerThread** my_worker_threads_ptr, int cron_interval) :
pink::DispatchThread<MyPbConn>(my_port, my_worker_threads_num, reinterpret_cast<pink::WorkerThread<MyPbConn>**>(my_worker_threads_ptr), cron_interval) {}
~MyDispatchThread() {}
private:
MyDispatchThread(MyDispatchThread&);
MyDispatchThread& operator=(MyDispatchThread&);
};