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#法式設計有所贊助。