C#端口转发

转载自:https://www.jb51.net/article/62638.htm

太优秀的示例代码,转载了

复制代码
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;
        }
      }
    }
  }
}
复制代码

 下面是原创的socket版,不是转载的哦

复制代码
class Program
{
    static bool resetFlag = true;
    static readonly object resetFlagLocker = new object();

    static void Main(string[] args)
    {
        var localSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        localSocket.Bind(new IPEndPoint(IPAddress.Any, 20000));
        localSocket.Listen(10);

        while (true)
        {
            try
            {
                lock (resetFlagLocker)
                {
                    if (!resetFlag)
                        continue;

                    resetFlag = false;
                }

                var client1 = localSocket.Accept();
                client1.SendTimeout = 300000;
                client1.ReceiveTimeout = 300000;

                var client2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client2.Connect("localhost",3389);

                object obj1 = (object)(new Socket[] { client1, client2 });
                object obj2 = (object)(new Socket[] { client2, client1 });

                ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj1);
                ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj2);
                
                Console.WriteLine("Transfer started");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Main error:" + ex.Message);
            }
        }
    }

    public static void transfer(object obj)
    {
        var socketA = ((Socket[])obj)[0];
        var socketB = ((Socket[])obj)[1];
        
        while (true)
        {
            try
            {
                var data = new byte[10240];
                int read = socketA.Receive(data);
                socketB.Send(data.Take(read).ToArray());
            }
            catch (Exception ex)
            {
                lock (resetFlagLocker)
                {
                    resetFlag = true;
                }

                Console.Write("Transfer error:" + ex.Message);
                
                try { socketA.Close(); } catch {}
                try { socketB.Close(); } catch {}
                
                break;
            }
        }
    }
}
复制代码

 

posted on   空明流光  阅读(2113)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示