因為在浙大,物理網絡卡的位址被分配為222.205.xx.xx,但是子網掩碼是255.255.255.0,這樣的話雖然大家都在乙個區域網裡面,但是卻不一定在同乙個子網。
區域網聯機遊戲為了發現區域網中的主機,會傳送廣播包,有些區域網聯機遊戲,會傳送到255.255.255.255這個廣播位址(典型代表war3),但是這個廣播位址
是只能廣播到子網的,路由器預設不**,這樣就造成了我們同在校園網卻無法聯機的問題。
想了想解決方案,可能使用虛擬網絡卡做乙個虛擬區域網是乙個解決方案,於是我安裝了openvpn,然後使用其tap0901網絡卡驅動,可以讀取登錄檔
獲取tap0901裝置的例項uuid以及顯示在網路和共享中心的那個網路名稱:hkey_local_machine\system\currentcontrolset\control\class\
這個裡面有很多項,代表了多個網絡卡介面,其中會有乙個是tuntap裝置,通過類似這樣的位址hkey_local_machine\system\currentcontrolset\control\class\\0002
下的componentid
為tap0901
來確定tap網絡卡,然後讀取該項下面的netcfginstanceid
,就是tap網絡卡的uuid,得到這個uuid之後,
可以使用createfile
函式來開啟乙個tuntap裝置:
開啟這個裝置後,就可以對其傳送指令了,參照tuntap的驅動源**tap-windows6,可以獲得一些巨集,以及一些指令的引數資訊,然後使用
deviceiocontrol
傳送到裝置:
deviceiocontrol(f, tap_ioctl_set_media_status, config, 4, config, 4, &returnlen, null);
啟動tuntap裝置之前,要考慮到單機遊戲傳送廣播包,所以應該修改路由表,讓255.255.255.255
路由經過我們的tuntap裝置,以及作為虛擬區域網,每個tuntap裝置應該有乙個虛擬ip,這裡
假設為192.168.1.10
。設定ip的windowsapi在win7之後的系統就沒有了,所以我也只能使用呼叫netsh
命令列的方式來設定ip,然後使用getipforwardtable2
來得到路由表資訊,使用
deleteiptableentry2
來刪除其他路由表,以及通過notifyroutechange
獲得路由表改變的通知,收到後去再次修改路由表,另外在退出時恢復之前的路由表。做好這一步之後,
我們要做的就是**了。
讀取裝置上的幀,使用非同步讀取檔案的readfile
即可:
if (readfile(hfile, buff, 1500, &read, &ol) != false)
else
if ((errno = getlasterror()) == error_io_pending)
}else
這段**因為處於子執行緒中,所以還有等待執行緒退出訊號的部分,用了waitformultiobjects
。我使用的是tap模式,是二層裝置,收到的是乙太網幀,所以要有乙太網幀的解析:
bool ethernetiipacket::parse(const
char* raw, int length)
然後解析出上層協議型別,如果是ipv4,那麼就要對ipv4進行解析:
bool ipv4packet::parse(const
char* raw, int length)
之後,為了能夠收到其他端從udp傳入的資料,我們需要偵聽校園網的ip位址,然後收到包之後將udp的內容(原始的ip報文)封裝到乙太網幀中,傳送回裝置,
但是乙太網幀需要知道自己和傳送方的mac位址,這就得使用getiftable2
來獲取網路介面資訊了,將tuntap的nac位址填充進去,然後使用writefile
傳送
回裝置。
但是這時,我發現主機雖然給後來加入的計算機傳送了地圖資訊,但是之後就沒有任何通訊了,於是檢查了下發包。發現有大量尋找192.168.1.8
和192.168.1.1
的arp包(因為測試使用的兩台計算機的虛擬ip分別為192.168.1.10
,192.168.1.8
。原來socket在傳送前,會先檢索目的ip位址對應的mac是不是在自己mac
表裡面,如果不在,那麼就通過arp協議去詢問,如果還詢問不到,那就去詢問閘道器的,如果搞不定,那麼只能無動於衷,也就是不發包了。所以,我又額外實現了一套
arp協議:
bool ipv4arppacket::parse(const
char* data, int length)
完善arp協議之後,就可以順利聯機啦!另外注意360可能會報病毒,程式要以管理員身份執行(可以修改鏈結屬性,出現uac標識),以及關閉windows防火牆
(windows防火牆會攔截不明udp包,即不請自來的udp包)。完整**參見github
製作乙個自己的xhprof測試平台
1 1.解壓檔案 unzip 2.cd extension 3.usr local php bin phpize 4.configure with php config usr local php bin php config enable xhprof 5.make 6.make install ...
自己製作的乙個進度條
自己寫的乙個簡易win下的進度條 using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text us...
如何製作乙個自己的docker映象
功能類似於 npm 的 package.json 簡單來說就是製作這個 docker 的配置檔案 構建乙個docker映象 建立乙個dockerfile 表示依賴其它的映象,必須保證本地有這個映象 from nginx 將所有者 作者 資訊寫入到映象中 maintainer test name te...