從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...