網路遊戲通訊模型初探(四)

2021-03-31 11:21:31 字數 1287 閱讀 3072

struct tagmessage;

// 訊息指令

// 指令相關的玩家標識

char strtalk[256]; // 訊息內容

上面是抽象出來的乙個極為簡單的訊息包結構,我們先來談談其各個資料域的用途:

首先,ltype 是訊息指令的型別,這是最為基本的訊息標識,這個標識用來告訴伺服器或客戶端這條指令的具體用途,以便於伺服器或客戶端做出相應處理。lplayerid 被作為玩家的標識。大家知道,乙個玩家在機器內部實際上也就是一堆資料,特別是在遊戲伺服器中,可能有成千上萬個玩家,這時候我們需要乙個標記來區分玩家,這樣就可以迅速找到特定玩家,並將通訊資料應用於其上。

strtalk 是我們要傳遞的聊天資料,這部分才是真正的資料實體,前面的引數只是資料實體應用範圍的限定。

在組織完資料之後,緊接著就是把這個結構體資料通過socket 連線傳送出去和接收進來。這裡我們要了解,網路在進行資料傳輸過程中,它並不關心資料採用的資料結構,這就需要我們把資料結構轉換為二進位制資料碼進行傳送,在接收方,我們再將這些二進位制資料碼轉換回程式使用的相應資料結構。讓我們來看看如何實現:

tagmessagemsg;

msg.ltypemsg_chat;

msg.lplayerid 1000;

strcpy( &msg.strtalk, "聊天資訊" );

首先,我們假設已經組織好乙個資料報,這裡msg_chat 是我們自行定義的識別符號,當然,這個識別符號在伺服器和客戶端要統一。玩家的id 則根據遊戲需要來進行設定,這裡1000 只作為假設,現在繼續:

char* p = (char*)&msg;

long llength = sizeof( tagmessage );

send( ssocket, p, llength );

// 獲取資料結構的長度

我們通過強行轉換把結構體轉變為char 型別的資料指標,這樣就可以通過這個指標來進行流式資料處理,這裡通過sizeof() 獲得結構體長度,然後用winsock 的send() 函式將資料傳送出去。

接下來看看如何接收資料:

long llength = sizeof( tagmessage );

char* buffer = new char[llength];

recv( ssocket, buffer, llength );

tagmessage* p = (tagmessage*)buffer;

// 獲取資料

switch( p->ltype ) // 這裡的p->ltype為我們解析出來的訊息型別標識

總結

網路遊戲通訊模型初探(一)

本文就將圍繞三個主題來給大家講述一下網路遊戲的網路互連實現方法 網路遊戲與單機遊戲有乙個很顯著的差別,就是網路遊戲除了乙個供操作遊戲的使用者介面平台 如單機遊戲 外,還需要乙個用於連線所有使用者,並為所有使用者提供資料服務的伺服器,從某些角度來看,遊戲伺服器就像乙個大型的資料庫,提供資料以及資料邏輯...

C SOCKET通訊模型(四)IOCP

相比ioevent,iocp沒有事件監聽,而是採用執行緒池管理 其實就是對使用者建立的執行緒的乙個分配管理機制,本身並不會建立多餘額外的執行緒 佇列的形式,這個系統佇列也就是所謂的完成埠,用於核心與應用層的互動。iocp沒有監聽事件數量的限制,沒有事件列表為空需要等待的問題,雖然ioevent沒有i...

Twisted的網路通訊模型

twisted的網路通訊模型 一 twisted基本模型 twisted網路程式設計框架是一種基於事件的網路程式設計框架,使用者需要繼承特定的類,並過載其中的方法來處理網路通訊中可能出現的各種情況。twisted的網路通訊模型最基本的也要由三部分組成 反應器 reactor 協議 protocol ...