C#端口轉(zhuǎn)發(fā)用法詳解
本文實例講述了C#端口轉(zhuǎn)發(fā)用法。分享給大家供大家參考。具體分析如下:
這里以鏈接3389的時候為例
例子1:連接a機器的3389端口連不上,因為對方防火墻或者網(wǎng)關(guān)做了限制,只能訪問a機器的個別端口比如80。
例子2:連接a機器的幾乎所有端口都連不上(對方乃內(nèi)網(wǎng)或者防火墻網(wǎng)關(guān)做了限制),只能1433上去,但是對方可以連接你的某些端口。
解決方法:
第一種較簡單,只需要程序在對方開80,你連接他80,程序收到數(shù)據(jù)后,發(fā)送到他本機的3389,同時從他3389收到數(shù)據(jù)后返回到你。程序就是一個中轉(zhuǎn)站。
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)終端服務(wù)有時一個端口不行就換一個端口重連 { //下面的意思就是一旦程序收到你發(fā)送的數(shù)據(jù)包后立刻開2個線程做中轉(zhuǎn) try { TcpClient tc1 = tl.AcceptTcpClient(); //這里是等待數(shù)據(jù)再執(zhí)行下邊,不會100%占用cpu TcpClient tc2 = new TcpClient("localhost", 3389); tc1.SendTimeout = 300000; //設(shè)定超時,否則端口將一直被占用,即使失去連接 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#程序設(shè)計有所幫助。
- c# 防火墻添加/刪除 特定端口的示例
- C#檢測遠(yuǎn)程計算機端口是否打開的方法
- 基于C#實現(xiàn)的端口掃描器實例代碼
- c#檢測端口是否被占用的簡單實例
- C#獲取Windows進(jìn)程監(jiān)聽的TCP/UDP端口實例
- C#開發(fā)之Socket網(wǎng)絡(luò)編程TCP/IP層次模型、端口及報文等探討
- asp.net(c#)動態(tài)修改webservice的地址和端口(動態(tài)修改配置文件)
- c# 連接字符串?dāng)?shù)據(jù)庫服務(wù)器端口號 .net狀態(tài)服務(wù)器端口號
- c# AcceptEx與完成端口(IOCP)結(jié)合的示例
相關(guān)文章
C#實現(xiàn)子窗體與父窗體通信方法實例總結(jié)
這篇文章主要介紹了C#實現(xiàn)子窗體與父窗體通信方法,實例總結(jié)了常用的四種窗體通信方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09C# ping網(wǎng)絡(luò)IP 實現(xiàn)網(wǎng)絡(luò)狀態(tài)檢測的方法
下面小編就為大家?guī)硪黄狢# ping網(wǎng)絡(luò)IP 實現(xiàn)網(wǎng)絡(luò)狀態(tài)檢測的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08利用windows性能計數(shù)器進(jìn)行服務(wù)器性能監(jiān)控示例分享
這篇文章主要介紹了利用windows性能計數(shù)器進(jìn)行服務(wù)器性能監(jiān)控的方法,大家可以參考擴展其它功能2014-01-01C# Windows API應(yīng)用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法
這篇文章主要介紹了C# Windows API應(yīng)用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法,結(jié)合實例形式分析了GetDesktopWindow函數(shù)用于獲取窗口句柄的具體使用方法與相關(guān)注意事項,需要的朋友可以參考下2016-08-08