自建Socket轉發,使用遠端桌面(mstsc)連線家中電腦
網路結構圖如下:
開題先放圖,一切全靠編哈哈。
進入正題!
如圖所示,我們需要一個公網伺服器,利用公網伺服器將內網的資料進行轉發,從而實現兩個內網伺服器的通訊。沒錯,這不是p2p,原本想做成p2p,因為有點難度,所以先弄一個tcp資料包轉發,後面再來打洞進行p2p連線。
開發環境
VS2017 + asp net core2.1 + .net framework 4.5
整個過程是如何實現的呢?
1.被控客戶端啟動,傳送被控端名稱,例如:Home
2.伺服器接收到被控端的資料,將Home記錄,並將Home繫結到當前Tcp連線
3.主控端啟動,傳送要連線的“被控端服務”名稱,例如:Home
4.服務端接收到主控端的請求,查詢Home對應的Tcp連線
5.將從主控端來的資料轉發到被控端,將被控端來的資料轉發到主控端
程式碼在哪?
放到github上了: https://github.com/bobowire/Wireboy.Socket.P2PService
在實現的過程中遇到什麼問題了?
1.由於windows鎖屏後,Console.WriteLine方法會進行無限期等待,導致程式卡住不動。
解決辦法:在執行後,將所有的Console.WriteLine方法全部註釋掉了。
2.在連線一次之後,再次連線會因為接收函式的超時時間太長,導致後面連線失敗
解決辦法:增加守護執行緒,在進行資料傳輸後,開啟守護執行緒,一旦資料傳輸發生超時,啟動新的tcp連線進行通訊。為什麼不用自帶的超時?嗯,那時候沒想到這個東西。
講解一下程式碼吧?
程式碼很簡單,主要是用的TcpClient和TcpListener兩個類,利用Dictionary繫結Tcp連線與服務名稱,所以只允許一臺電腦連線被控端。如此一來,被控端的斷線重連對資料的轉發影響就不大了。
TcpListener類用於監聽本地埠。
TcpClient類用於轉發資料。
怎麼使用?
請檢視專案MD檔案: https://github.com/bobowire/Wireboy.Socket.P2PService
執行效果圖