前日玩DOTA一連輸幾把,好不容易最后一把推上對方高地了,卻被主給T了。痛定思痛,最近幾天,我潛心研究了下魔獸T人掛,在這與喜歡DOTA的朋友分享下。
首先談談局域網魔獸的聯機機制吧。這部分我沒有切膚之痛,所以也沒深鑽,只是想告訴大家我們開啟魔獸或者主機建主都要對同一個網段發送各種各樣的UDP廣播包,注意,在這我是說同一個網段,這也就解釋了為什么我們同一個學校的學生在學校局域網上玩DOTA還要用某個小軟件,而不能直接看到,網段和局域網還是有區別的,在這我就不詳解了。然后當我們點擊“進入游戲”時,便與其他人建立了TCP連接。如圖:

上圖中間那台為主機,注意,我這里只是畫出了其他9台機子與主機的TCP連接,而實際上這10台機子兩兩之間都是有TCP連接的。我們可以在玩DOTA的時候從桌面上點擊:開始 - 運行 - 輸入cmd - 輸入netstat -n回車,可以查看到這些TCP連接(顯示的列表還有你其他進程此時的TCP連接,哪些是war3的用排除法應該就能找出),即使不是主機,也能看到18條TCP的連接(為什么會多一倍呢?嘿,有去有回唄)。聰明的童鞋會問了,那我為什么多此一舉畫個圖出來還只標主機的9條(實際18條....
)?因為啊,非主機之間的的TCP連接平時是不用的,我們的數據都是通過主機傳輸,所以我還故意標了顯眼的紅色。有人又要問了,明明有直通的還繞遠,暴雪SB啊??這個是基於服務器/客戶機技術模式所必須的,在這我就不深談了,但有一點是顯然的,其實效率並不會低多少,一般我們的一個動作的數據,總是要發給所有人的(不能9台機子上牛都跳了,而有一台機子上還沒跳吧,那撼地神牛哭了
),如此一來,用兩種方式數一數走的路子應該是一樣的。由此可見,一台好的主機在一場犀利的戰役中是多么的重要,在此,我再次強烈呼吁那些“小霸王”就別建主!!當然,非主機之間的TCP連接也不是沒用,比如在魔獸中我們與某位玩家私聊,或者主機退了(魔獸會馬上將另外一個玩家選為主機),那些個TCp連接中的一對或一些就會有用處了。
剛才說的是局域網玩DOTA的環境,下面再談談在對戰平台上又如何。平台在其中所扮演的角色,比如用戶ID與游戲名的綁定、讓我們能看到Internet上有人建主、積分核算。。。這我都不深談了。只是說說和做T人掛相關的一點。上面我提到游戲中10名玩家之間建立的是TCP連接,主機作為TCP的服務器端,非主機是客戶端,此時我們最關鍵的問題,其實也是對戰平台最關鍵的問題來了:沒辦法在Internet上實現兩個非服務器主機之間的直接TCP連接!!!(注意,我在這掃下盲,服務器與客戶機不是一個單純的稱謂,它們各自其中維系通信的代碼是有很大區別的,就像我們打電話,電話接起來后都一樣,但是接之前,兩端干的事斷然不同),而至於為什么不能直接TCP連接,我在這就不闡述了,要說起來too long too long....(其實為什么要用C/S模式以及這里為什么不能直接相連,想想我舉的打電話例子應該能悟出一二)。
那對戰平台是怎么實現在Internet上通過War3的局域網模式連接對戰的呢?簡單來說是如果A建了一個主機,B要進A的主機,A通過平台轉發過來的消息知道B要連接主機,就在自己本地創建一個TCP的客戶端,讓這個客戶端與war進程的服務端連接,在魔獸中就相當於有玩家B連接進A主機建立的游戲,同時B主機在自己本地創建一個TCP服務端,讓War進程的TCP客戶端連接到自己本地的服務端。既然都是在本地建立的TCP連接,那么怎么實現主機和非主機的游戲數據交換的呢??

從上面的圖可以看出,War3主機和非主機的數據交換,其實是在兩個本地模擬創建的TCPsever和TCPClient之間進行的,當主機有數據要發給非主機,先會將數據發給主機本地的TCPClient,然后對戰平台會從TCPClient數據緩沖池中取出數據,通過UDP的方式,發給非主機,非主機會將UDP數據放入TCPServer的發送數據緩沖池,由它發給魔獸進程中的TCPClient,反過來一樣,這樣就實現了魔獸數據的完成傳輸,Internet上的聯網對戰也就實現了。如果此時按照我以上所述輸入netstat -n來查看,會看到與本機war3進程通信的9對TCP連接的源IP和目的IP都是127.0.0.1,這是一個環回地址,也就是本機IP地址。
在這我還要強調一點,只要我們點擊了“進入游戲”之后,對戰平台基本上就與我們脫離了,此刻我們就像在一個局域網玩一樣,游戲中的數據是基本不經過平台的,所以上圖也沒畫出來。當然,除了類似“HF小貼士”之類的東西強行給我們看。
以上說了那么那么長一段廢話,現在我來揭露T人掛是怎么做到的:從上圖我們應該可以獲得答案。如果主機關閉了本地用來接受遠程非主機傳輸的UDP信息的那個TCPClient,那么很顯然,主機將不能獲得這個非主機信息,遠程的那個非主機也不能收到主機轉發的游戲數據包了,這個時候這個非主機War3進程理所當然的認為自己與主機失去了連接,T人掛的目的也就達到了。由此,結合第一個圖以及我上面部分的闡述,可以發現只有主機才能T人,想要做一個非主機T人的掛就不好辦了(特殊手段不排除,但我沒見過),當然,如果主機退了,后來充當主機的那個也能較容易的實現T人。
真相揭露到這還沒有結束,不然怎么能說我是真怒了。現在瞌睡了先到這,在下篇我將具體談一下利用以上結論如何寫一個T人掛。
雖然現在這年頭十人九掛的,但是我寫這個絕不是為了縱容惡習進一步地滋生。僅僅是分享給喜歡DOTA、喜歡魔獸、鍾情對戰平台的朋友來了解其中的奧妙,極端潔癖人士別噴我。
