Quake源代碼分析(草稿).4

转载 2006年05月18日 14:30:00

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()處理.

Quake源代碼分析(草稿).4

Quake網絡部分總結:(1) 網絡部分被分為接收和傳送兩個部分.(2) 傳送部份被分為本地數據包傳輸和異地數據包傳輸兩個部分.(3) 本地封包傳輸由NET_SendLoopbackPacket()負...
  • breakpointer
  • breakpointer
  • 2004年10月11日 13:55
  • 1478

Quake源代碼分析(草稿).3

消息處理:       我把Quake的消息分為兩類,一種是常用輸入設備產生的消息,譬如KeyBoard,Mouse,JoyStick等.       另一種就是網絡或本地傳輸數據包時引發的消息.  ...
  • amdk_7
  • amdk_7
  • 2006年05月18日 14:25
  • 862

Quake源代碼分析(草稿).2

        在上一篇文章里,我談到過Quake的各個邏輯模塊被封裝在不同的DLL中,它們之間的交互利用了引出函數作為接口.這一點有點像COM,不同的是COM需要對DLL進行註冊,因為COM有時要提...
  • amdk_7
  • amdk_7
  • 2006年05月18日 14:24
  • 1018

Quake源代碼分析(草稿).3

  消息處理:       我把Quake的消息分為兩類,一種是常用輸入設備產生的消息,譬如KeyBoard,Mouse,JoyStick等.       另一種就是網絡或本地傳輸數據包時引發的消息....
  • breakpointer
  • breakpointer
  • 2004年10月10日 10:57
  • 1541

Quake源代碼分析(草稿).1

        Quake是Id Software公司推出一款風迷全球的FPS遊戲.至今為止已經發展到了第三代,而且作為一個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的C...
  • breakpointer
  • breakpointer
  • 2004年09月30日 09:40
  • 3070

Quake源代碼分析(草稿)

 http://blog.csdn.net/breakpointer/archive/2004/09/30/121378.aspxQuake是Id Software公司推出一款風迷全球的FPS遊戲.至...
  • yangdelong
  • yangdelong
  • 2007年09月03日 18:01
  • 1692

Quake源代碼分析(草稿).5

網絡部分補充說明:         負責傳送網間封包Sys_SendPacket()函數,調用了sendto這個Win socket API,它的作用是:         The sendto fun...
  • breakpointer
  • breakpointer
  • 2004年10月12日 09:31
  • 1495

Quake源代碼分析(草稿).1

       Quake是Id Software公司推出一款風迷全球的FPS遊戲.至今為止已經發展到了第三代,而且作為一個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的CS...
  • amdk_7
  • amdk_7
  • 2006年05月18日 14:19
  • 2347

Quake源代碼分析(草稿).5

網絡部分補充說明:         負責傳送網間封包Sys_SendPacket()函數,調用了sendto這個Win socket API,它的作用是:         The sendto fun...
  • amdk_7
  • amdk_7
  • 2006年05月18日 14:31
  • 1004

Quake源代碼分析(草稿).2

        在上一篇文章里,我談到過Quake的各個邏輯模塊被封裝在不同的DLL中,它們之間的交互利用了引出函數作為接口.這一點有點像COM,不同的是COM需要對DLL進行註冊,因為COM有時要提...
  • breakpointer
  • breakpointer
  • 2004年10月03日 17:05
  • 1929
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Quake源代碼分析(草稿).4
举报原因:
原因补充:

(最多只允许输入30个字)