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è)計有所幫助。
相關(guān)文章
基于C#實現(xiàn)Windows后臺窗口操作與圖像處理技術(shù)分析
在Windows編程中,操作后臺窗口是一項復(fù)雜而有用的技術(shù),它可以用來自動化用戶界面測試、應(yīng)用程序機器人等場景,本文將深入探討如何在C#中綁定后臺窗口、獲取后臺窗口界面圖片,以及在圖片中尋找指定圖標(biāo)并獲取坐標(biāo),需要的朋友可以參考下2024-12-12
C#中實現(xiàn)Fluent Interface的三種方法
這篇文章主要介紹了C#中實現(xiàn)Fluent Interface的三種方法,本文講解了Fluent Interface的簡單實現(xiàn)、使用裝飾器模式和擴展方法實現(xiàn)Fluent Interface等3種實現(xiàn)方法,需要的朋友可以參考下2015-03-03
C#使用FluentHttpClient實現(xiàn)請求WebApi
FluentHttpClient 是一個REST API 異步調(diào)用 HTTP 客戶端,調(diào)用過程非常便捷,下面我們就來學(xué)習(xí)一下C#如何使用FluentHttpClient實現(xiàn)請求WebApi吧2023-12-12

