|
|
Quake源代碼分析(草稿).4 |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
Quake網絡部分總結: (1) 網絡部分被分為接收和傳送兩個部分. (2) 傳送部份被分為本地數據包傳輸和異地數據包傳輸兩個部分. (3) 本地數據包傳輸由NET_SendLoopbackPacket()負責. (4) 異地數據包傳輸由Sys_SendPacket()負責. (5) 數據包傳輸又可以分為單包傳輸和多包傳輸. (6) NET_SendPacket()可以傳送本地或異地不超過一個封包大小的數據包.也就是單包傳輸. (7) Netchan_Transmit() 根據數據包的大小選擇傳輸方式,如果數據包大於一個封包的尺寸, 那麼就調用Netchan_TransmitNextFragment()函數, 将需要传送的数据块(MAX_MSGLEN)切割成若干等大小(MAX_PACKETLEN - 100)的封包,然後再啟動NET_SendPacket()傳送. 否則如果數據包小於一個封包的尺寸,那麼就直接調用NET_SendPacket()傳送. 上述数据包被NET_SendPacket()傳送前都会先被Netchan_ScramblePacket()进行加密(搅乱里面的数据),然后再用CL_Netchan_Encode()给它们编码. 這就是多包傳輸. 從上面的說明能夠看出其實多包傳輸最終還是要轉變為單包傳輸. (8) 數據包接收也分為本地數據包接收和異地數據包接收. (9) 本地數據包接收: NET_GetLoopbackPacket() (10) 異地數據包接收: Sys_GetPacket() (11) 當系統接收到異地數據包時會觸發SE_PACKET事件,當這個事件到達Com_EventLoop()時,啟動CL_PacketEvent()處理客戶端傳送過來的數據包, 啟動SV_PacketEvent()處理服務器端傳送過來的數據包. CL_PacketEvent()?CL_Netchan_Process()?Netchan_Process() SV_PacketEvent()?SV_Netchan_Process()?Netchan_Process() 對於那些多包的數據,交由CL_Netchan_Process()或SV_Netchan_Process()來處理,它會一直等到全部封包都接收下來後再調用 Netchan_UnScramblePacket()解密,接著用CL_Netchan_Decode()解码.最後用戶就可以讀到完整的數據包了. (12) 當系統接收到本地數據包時直接啟動 CL_PacketEvent()或SV_PacketEvent() 而且不需要等待封包.因為這些封包沒有進入網絡,所以 while( NET_GetLoopbackPacket( NS_CLIENT, &adr, &msg ) ) while( NET_GetLoopbackPacket( NS_SERVER, &adr, &msg ) ) 上面的循環把全部被切割的封包一次性全部讀出. (13) 利用NET_SendPacket() 直接傳送數據的函數有NET_OutOfBandPrint()?NET_SendPacket() 註:用NET_OutOfBandPrint()传送出来的数据包,前四个字节一定是FFFFFFFF,即-1. 它們会被SV_ConnectionlessPacket()和CL_ConnectionlessPacket()處理.

|
|
相关文章:相关软件: |
|