本文實例講述了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,否則連接一旦中斷程序就崩潰了//要是彈出錯誤提示讓機主看見那就
主站蜘蛛池模板:
左权县|
平泉县|
隆安县|
扶绥县|
宕昌县|
固镇县|
日喀则市|
富蕴县|
龙岩市|
红安县|
内乡县|
青阳县|
霍林郭勒市|
昌乐县|
湛江市|
荥阳市|
临安市|
漠河县|
延庆县|
怀宁县|
宣威市|
莆田市|
松潘县|
芜湖县|
偃师市|
红河县|
莱西市|
石阡县|
山阳县|
香港
|
饶平县|
宁远县|
称多县|
河北省|
靖安县|
莒南县|
三门峡市|
东海县|
锦屏县|
淮安市|
孝昌县|