打個比方,就拿War3來說吧:
1、你是怎么看到局域網里誰開了主機的?
魔獸這游戲是靠UDP廣播找主機的。每臺電腦都盯著一個固定端口(比如6112),誰開房,就往整個局域網發個我開好啦的消息,目標地址是255.255.255.255,這就是UDP廣播。其他機器收到這個包,就知道有人建房了,列表里就能看見。
2、那點加入之后發生了啥?
點加入的時候,你的電腦就會用TCP去連主機,IP從廣播里拿到,端口還是6112。主機要是沒滿員、沒關房,就會accept這個連接,然后發地圖信息、玩家列表這些數據過來,你就進去了。之后你和主機就靠這條TCP鏈通信,一路打完。
3、那平臺是怎么搞跨網聯機的?
關鍵在這兒:平臺會劫持你電腦上的tcp.connect和tcp.accept這兩個操作。你點加入時,它不讓直接連對方,而是把連接地址偷偷改成127.0.0.1(也就是本地代理)。同時它也hook住accept,假裝你是主機。
然后平臺在背后幫你把連接請求轉發到真正的主機那邊。如果對方同意接入,平臺就在本地造一個虛擬TCP連接給你冒充真的。所有你發的數據,都被平臺截住,打包成目標虛擬IP + 數據 + 我的虛擬IP這種格式,走UDP發給服務器。服務器一查表,知道目標真實IP,再轉出去——這就實現了外網變內網的效果,全程像在局域網打一樣。
1、你是怎么看到局域網里誰開了主機的?
魔獸這游戲是靠UDP廣播找主機的。每臺電腦都盯著一個固定端口(比如6112),誰開房,就往整個局域網發個我開好啦的消息,目標地址是255.255.255.255,這就是UDP廣播。其他機器收到這個包,就知道有人建房了,列表里就能看見。
2、那點加入之后發生了啥?
點加入的時候,你的電腦就會用TCP去連主機,IP從廣播里拿到,端口還是6112。主機要是沒滿員、沒關房,就會accept這個連接,然后發地圖信息、玩家列表這些數據過來,你就進去了。之后你和主機就靠這條TCP鏈通信,一路打完。
3、那平臺是怎么搞跨網聯機的?
關鍵在這兒:平臺會劫持你電腦上的tcp.connect和tcp.accept這兩個操作。你點加入時,它不讓直接連對方,而是把連接地址偷偷改成127.0.0.1(也就是本地代理)。同時它也hook住accept,假裝你是主機。
然后平臺在背后幫你把連接請求轉發到真正的主機那邊。如果對方同意接入,平臺就在本地造一個虛擬TCP連接給你冒充真的。所有你發的數據,都被平臺截住,打包成目標虛擬IP + 數據 + 我的虛擬IP這種格式,走UDP發給服務器。服務器一查表,知道目標真實IP,再轉出去——這就實現了外網變內網的效果,全程像在局域網打一樣。