除了上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 完美的機制。
執行結果:
-----另解----------
由於是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 完美的機制。
執行結果:
沒有留言:
張貼留言