星期三, 2月 11, 2009

battlelan for Linux

雖然說Linux 本身不是設計用來玩遊戲的,但是有時候還是想玩一些遊戲。我最常玩的大概就是StarCraft(天阿,好老的遊戲,聽說快出2 了!!) 跟 WarCraft3 吧。但這些戰略遊戲自己玩單機一點也沒挑戰性,也不刺激,所以連線對戰可以說是這些戰略遊戲最重要的部分了。

除了上Battle.Net 以外,有時候我們想用區網連線,Windows 上透過 BattleLan 或是 LanCraft 都可以以 socket redirecting 達到與區網外連線的目的,但Linux 上我好像沒有看到類似的軟體。

那時候為了跟同學連線,上網找了相關的資料,後來看到有人自己寫了BattleLan,雖然是在Windows 上的,可是有了他的程式碼我可以改成在Linux 上用的BattleLan。搭配Qt,我做了我的'FreeLan',執行畫面如下。

目前是可以一次設定多個連線的ip/host,對於host game 很方便,做client 的時候通常只要設定一組就可以了。現在做的還不是很完全,所以暫時大概也不會開放下載,但如果很想要的人可以跟我要:p。

-----另解----------
由於是socket redirecting,理論上使用 iptables 也可以做到這種功能,但是我對iptables 實在不熟,試過幾種設定都不見功效,如果有高人請賜教 :)

不過以上這兩種都需要root的權限才行。

-----又 另解-------
就像Windows 上的 Garena (人稱 GGc),理論上也是可以hook 那些socket 的api (透過LD_PRELOAD, 應該可以) 修改過封包以後再送出,這種方法我還沒試過,不過就算是wine,最後也是調用系統的socket function 才是,所以我想這應該是沒問題的,而且這種方法也不需要root 的權限,應該是最方便的解決方法。

-------------------------------------------------------------------
02/13/09 更新

今天看了一下 wine 的 source, 看來WSASendTo 的地方是用 sendmsg 來實作。於是便寫了一個小 library 用 LD_PRELOAD 替換掉wine 會呼叫的 sendmsg,完全符合我預期的情況,看到War3 送了一堆broadcast 的 packet,redirecting 或修改封包也都不成問題了。想一想,這東西要是在Windows 下寫還真麻煩,不得不讚賞一下 Linux 完美的機制。

執行結果:

沒有留言: