Socket遠程桌面


自建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

運行效果圖

 

 
分類:  C#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM