第二人生的原始碼分析 三十二 訊息解包的實現

2021-09-11 02:54:41 字數 4773 閱讀 2031

從udp接收到資料後,就會組裝成乙個完整的資料報,然後檢驗整個資料報是否有效,並且還處理收到回應的udp包標識,這樣構造乙個完整的可靠性連線。具體處理**如下:

#001 bool llmessagesystem::checkmessages( s64 frame_count )

#002 

#016 

下面開始迴圈處理所有收到的訊息包。

#017 

// loop until either no packets or a valid packet

#018 

// i.e., burn through packets from unregistered circuits

#019 

s32 receive_size = 0;

#020 

do#021 

#047 

// no data in packet receive buffer

#048 

valid_packet = false;

#049 

}#050 

else

#051 

#064 

else

#065 

#074 

}#075 

下面解壓縮包資料。

#076 

// process the message as normal

#077 

mincomingcompressedsize = zerocodeexpand(&buffer, &receive_size);

#078  

mcurrentrecvpacketid = ntohl(*((u32*)(&buffer[1])));

#079 

host = getsender();

#080 

找到這個host的環路,然後讓這個環路管理類處理。

#081 

const bool resetpacketid = true;

#082 

cdp = findcircuit(host, resetpacketid);

#083 

#084 

// at this point, cdp is now a pointer to the circuit that

#085 

// this message came in on if it's valid, and null if the

#086 

// circuit was bogus.

#087 

處理那些伺服器已經收到回應的id。

#088 

if(cdp && (acks > 0) && ((s32)(acks * sizeof(tpacketid)) < (true_rcv_size)))

#089 

#101 

if (!cdp->getunackedpacketcount())

#102 

#106 

}#107 

檢視這個包是否需要確認的處理的。

#108 

if (buffer[0] & ll_reliable_flag)

#109 

#112 

if (buffer[0] & ll_resent_flag)

#113 

#133 

// ***************************************

#134 

>macks.put(mcurrentrecvpacketid);

#135 

cdp->collectrack(mcurrentrecvpacketid);

#136 

}上面把收到伺服器的包id也儲存到下一次回應包佇列裡,準備返回去給伺服器確認。

#137 

#138 

//llinfos << "discarding duplicate resend from " << host << llendl;

#139 

if(mverboselog)

#140 

#153 

mpacketsin++;

#154 

valid_packet = false;

#155 

continue;

#156 

}#157 

}#158 

通過上面這段**的學習,可以看到udp的可靠性,就是通過自己的包id來作確認的。主要通過包的長度來檢視包是否完整,然後通過包的標識來檢視這個資料報後面是否有伺服器收到的包id發回來確認。因為有些資料是經過壓縮的,所以在這裡也呼叫函式zerocodeexpand來解壓。

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!

從udp接收到資料後,就會組裝成乙個完整的資料報,然後檢驗整個資料報是否有效,並且還處理收到回應的udp包標識,這樣構造乙個完整的可靠性連線。具體處理**如下:

#001 bool llmessagesystem::checkmessages( s64 frame_count )

#002 

#016 

下面開始迴圈處理所有收到的訊息包。

#017 

// loop until either no packets or a valid packet

#018 

// i.e., burn through packets from unregistered circuits

#019 

s32 receive_size = 0;

#020 

do#021 

#047 

// no data in packet receive buffer

#048 

valid_packet = false;

#049 

}#050 

else

#051 

#064 

else

#065 

#074 

}#075 

下面解壓縮包資料。

#076 

// process the message as normal

#077 

mincomingcompressedsize = zerocodeexpand(&buffer, &receive_size);

#078  

mcurrentrecvpacketid = ntohl(*((u32*)(&buffer[1])));

#079 

host = getsender();

#080 

找到這個host的環路,然後讓這個環路管理類處理。

#081 

const bool resetpacketid = true;

#082 

cdp = findcircuit(host, resetpacketid);

#083 

#084 

// at this point, cdp is now a pointer to the circuit that

#085 

// this message came in on if it's valid, and null if the

#086 

// circuit was bogus.

#087 

處理那些伺服器已經收到回應的id。

#088 

if(cdp && (acks > 0) && ((s32)(acks * sizeof(tpacketid)) < (true_rcv_size)))

#089 

#101 

if (!cdp->getunackedpacketcount())

#102 

#106 

}#107 

檢視這個包是否需要確認的處理的。

#108 

if (buffer[0] & ll_reliable_flag)

#109 

#112 

if (buffer[0] & ll_resent_flag)

#113 

#133 

// ***************************************

#134 

>macks.put(mcurrentrecvpacketid);

#135 

cdp->collectrack(mcurrentrecvpacketid);

#136 

}上面把收到伺服器的包id也儲存到下一次回應包佇列裡,準備返回去給伺服器確認。

#137 

#138 

//llinfos << "discarding duplicate resend from " << host << llendl;

#139 

if(mverboselog)

#140 

#153 

mpacketsin++;

#154 

valid_packet = false;

#155 

continue;

#156 

}#157 

}#158 

通過上面這段**的學習,可以看到udp的可靠性,就是通過自己的包id來作確認的。主要通過包的長度來檢視包是否完整,然後通過包的標識來檢視這個資料報後面是否有伺服器收到的包id發回來確認。因為有些資料是經過壓縮的,所以在這裡也呼叫函式zerocodeexpand來解壓。

第二人生的原始碼分析 三十二 訊息解包的實現

從udp接收到資料後,就會組裝成乙個完整的資料報,然後檢驗整個資料報是否有效,並且還處理收到回應的udp包標識,這樣構造乙個完整的可靠性連線。具體處理 如下 001 bool llmessagesystem checkmessages s64 frame count 002 016 下面開始迴圈處理...

第二人生的原始碼分析 2 第二人生的基本功能

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!第二人生的基功能可以定義為網路遊戲 社交網路和 web2.0 作為網路遊戲,它可以讓人扮演角色,也就是第二人生裡的居民。居民只要買到地,或者租到地後就可以建造各種各樣的自己想得到的東西。比如建造遊樂園,或者建造電影院,又或者建造過山車。同時,還可以...

第二人生的原始碼分析 三十七 訊息處理的完整流程

雖然上面介紹了這麼多訊息處理 從網路接收到資料,再從資料解釋到資料獲取,但沒有乙個清晰的流程,下面就來詳細地分析這個資料流程是怎麼樣呼叫的。具體呼叫流程如下 空閒時處理函式。3.llmessagesystem checkallmessages 檢查訊息系統所有訊息。4.llmessagesystem...