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