自建Socket轉發,使用遠程桌面(mstsc)鏈接家中電腦

網絡結構圖以下:git

網絡示意圖

開題先放圖,一切全靠編哈哈。github

進入正題!windows

如圖所示,咱們須要一個公網服務器,利用公網服務器將內網的數據進行轉發,從而實現兩個內網服務器的通信。沒錯,這不是p2p,本來想作成p2p,由於有點難度,因此先弄一個tcp數據包轉發,後面再來打洞進行p2p鏈接。服務器

開發環境

VS2017 + asp net core2.1 +  .net framework 4.5網絡

整個過程是如何實現的呢?

1.被控客戶端啓動,發送被控端名稱,例如:Hometcp

2.服務器接收到被控端的數據,將Home記錄,並將Home綁定到當前Tcp鏈接函數

3.主控端啓動,發送要鏈接的「被控端服務」名稱,例如:Home.net

4.服務端接收到主控端的請求,查詢Home對應的Tcp鏈接線程

5.將從主控端來的數據轉發到被控端,將被控端來的數據轉發到主控端3d

 

代碼在哪?

放到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

運行效果圖

相關文章
相關標籤/搜索