C#端口轉發用法詳解。本站提示廣大學習愛好者:(C#端口轉發用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#端口轉發用法詳解正文
本文實例講述了C#端口轉發用法。分享給年夜家供年夜家參考。詳細剖析以下:
這裡以鏈接3389的時刻為例
例子1:銜接a機械的3389端口連不上,由於對方防火牆或許網關做了限制,只能拜訪a機械的個體端口好比80。
例子2:銜接a機械的簡直一切端口都連不上(對方乃內網或許防火牆網關做了限制),只能1433上去,然則對方可以銜接你的某些端口。
處理辦法:
第一種較簡略,只須要法式在對方開80,你銜接他80,法式收到數據後,發送到他本機的3389,同時從他3389收到數據後前往到你。法式就是一個直達站。
using System; using System.Net.Sockets; using System.Threading; namespace PortTransponder { class Program { static void Main(string[] args) { TcpListener tl = new TcpListener(80); //這裡開對方可以被你銜接而且未被占用的端口 tl.Start(); while (true) //這裡必需用輪回,可以吸收不止一個客戶 //由於我發明終端辦事有時一個端口不可就換一個端口重連 { //上面的意思就是一旦法式收到你發送的數據包後連忙開2個線程做直達 try { TcpClient tc1 = tl.AcceptTcpClient(); //這裡是期待數據再履行下邊,不會100%占用cpu TcpClient tc2 = new TcpClient("localhost", 3389); tc1.SendTimeout = 300000; //設定超時,不然端口將一向被占用,即便掉去銜接 tc1.ReceiveTimeout = 300000; tc2.SendTimeout = 300000; tc2.ReceiveTimeout = 300000; object obj1 = (object)(new TcpClient[] { tc1, tc2 }); object obj2 = (object)(new TcpClient[] { tc2, tc1 }); ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj1); ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj2); } catch { } } } public static void transfer(object obj) { TcpClient tc1 = ((TcpClient[])obj)[0]; TcpClient tc2 = ((TcpClient[])obj)[1]; NetworkStream ns1 = tc1.GetStream(); NetworkStream ns2 = tc2.GetStream(); while (true) { try { //這裡必需try catch,不然銜接一旦中止法式就瓦解了 //如果彈失足誤提醒讓機主看見那就囧了 byte[] bt = new byte[10240]; int count = ns1.Read(bt, 0, bt.Length); ns2.Write(bt, 0, count); } catch { ns1.Dispose(); ns2.Dispose(); tc1.Close(); tc2.Close(); break; } } } } }
願望本文所述對年夜家的C#法式設計有所贊助。