C#端口轉發(fā)用法詳解
本文實例講述了C#端口轉發(fā)用法。分享給大家供大家參考。具體分析如下:
這里以鏈接3389的時候為例
例子1:連接a機器的3389端口連不上,因為對方防火墻或者網(wǎng)關做了限制,只能訪問a機器的個別端口比如80。
例子2:連接a機器的幾乎所有端口都連不上(對方乃內(nèi)網(wǎng)或者防火墻網(wǎng)關做了限制),只能1433上去,但是對方可以連接你的某些端口。
解決方法:
第一種較簡單,只需要程序在對方開80,你連接他80,程序收到數(shù)據(jù)后,發(fā)送到他本機的3389,同時從他3389收到數(shù)據(jù)后返回到你。程序就是一個中轉站。
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) //這里必須用循環(huán),可以接收不止一個客戶 //因為我發(fā)現(xiàn)終端服務有時一個端口不行就換一個端口重連 { //下面的意思就是一旦程序收到你發(fā)送的數(shù)據(jù)包后立刻開2個線程做中轉 try { TcpClient tc1 = tl.AcceptTcpClient(); //這里是等待數(shù)據(jù)再執(zhí)行下邊,不會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#程序設計有所幫助。
相關文章
C# ping網(wǎng)絡IP 實現(xiàn)網(wǎng)絡狀態(tài)檢測的方法
下面小編就為大家?guī)硪黄狢# ping網(wǎng)絡IP 實現(xiàn)網(wǎng)絡狀態(tài)檢測的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08利用windows性能計數(shù)器進行服務器性能監(jiān)控示例分享
這篇文章主要介紹了利用windows性能計數(shù)器進行服務器性能監(jiān)控的方法,大家可以參考擴展其它功能2014-01-01C# Windows API應用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法
這篇文章主要介紹了C# Windows API應用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法,結合實例形式分析了GetDesktopWindow函數(shù)用于獲取窗口句柄的具體使用方法與相關注意事項,需要的朋友可以參考下2016-08-08