協議收發

協議收發

協議就是進程之間通信的內容。


進程通信方式

進程之間使用INetworkModule提供的工具進行網絡通信。它通過一個回調器(IEngineNetCallback)獲取通信的內容,我們需要自己實現這個回調器。

我們將協議作爲通信的內容,從一個進程發送到另一個進程,另一個進程收到協議後,需要根據協議號進行識別,然後做出相應的處理。

協議的定義 = 協議頭 + 協議內容

一個協議文件的格式是:

#ifndef __MSG_TEST_H__
#define __MSG_TEST_H__

#include "msgheader.h"
#include "msgcode.h"

#pragma pack(push) 
#pragma pack(4)

namespace Protocol
{
    class CSTest
    {
    public:
        CSTest() : header(MT_TEST_CS) {}
        MessageHeader header;
        char buffer[1024];
    };
}

#pragma pack(pop)

#endif // __MSG_TEST_H__


以下代碼片段表示其中的結構體定義將以4字節對齊。

#pragma pack(push) 
#pragma pack(4)

//...

#pragma pack(pop)

確定字節對齊長度並讓數據成員緊湊排列是很重要的,這樣才能確保另一端的進程正確解析該協議。

如果我們的結構體的成員沒有緊湊排列,或者沒有確定的字節對齊長度,那麼會出現什麼問題?、

協議都有一個協議頭(MessageHeader),它通過綁定一個協議號來標識該協議,一個協議必須擁有唯一的協議號。

協議處理的流程

協議處理的代碼佔據服務端編程內容的大部分。它的流程大致是:客戶端發送協議 -> 服務端接收協議並安排處理函數處理 -> 服務端返回處理結果協議。

如果你在編寫邏輯代碼,這個流程很可能是:

ServerNetworkCallback::OnRecv
    World::OnRecv
        SceneManager::OnRecv
            MessageHandler::HandleMessage
                MessageHandler::yourfunctions   // 你自己定義的處理函數

 

發佈了24 篇原創文章 · 獲贊 4 · 訪問量 7064
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章