C# 端口转发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiegemena/article/details/79923386

业务需要跳转ip,又不想迁移程序,可以用此方法进行端口转发

这里写图片描述

 static void Main(string[] args)
        {
            //默认 127.0.0.1:8080 转发到 127.0.0.1:80
            var dk = new DuanKou("0.0.0.0",8080,"0.0.0.0",80);
            dk.Run();
            Console.ReadKey();
        }
 /// <summary>
    /// user => tcp1 => tcp2
    /// </summary>
    public class DuanKou
    {
        int localProt { get; set; }
        string localIp { get; set; }
        int TargetPort { get; set; }
        string TargetIp { get; set; }
        public DuanKou(string localIp,int localProt, string TargetIp, int TargetPort)
        {
            this.localIp = localIp;
            this.localProt = localProt;
            this.TargetIp = TargetIp;
            this.TargetPort = TargetPort;
        }

        public DuanKou()
        {
            this.localIp = "0.0.0.0" ;
            this.localProt = 8080;
            this.TargetIp = "0.0.0.0";
            this.TargetPort = 80;
        }

        public void Run()
        {
            //服务器IP地址  
            IPAddress ip = IPAddress.Parse(localIp);
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ;
            serverSocket.Bind(new IPEndPoint(ip, localProt));
            serverSocket.Listen(10000);   
            Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
            Thread myThread = new Thread(Listen);
            myThread.Start(serverSocket);
        }

        //监听客户端连接
        private void Listen(object obj)
        {
            Socket serverSocket = (Socket)obj;
            IPAddress ip = IPAddress.Parse(TargetIp);
            while (true)
            {
                Socket tcp1 = serverSocket.Accept();
                Socket tcp2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                tcp2.Connect(new IPEndPoint(ip, TargetPort));
                //目标主机返回数据
                ThreadPool.QueueUserWorkItem(new WaitCallback(SwapMsg), new thSock
                {
                    tcp1 = tcp2,
                    tcp2 = tcp1
                });
                //中间主机请求数据
                ThreadPool.QueueUserWorkItem(new WaitCallback(SwapMsg), new thSock
                {
                    tcp1 = tcp1,
                    tcp2 = tcp2
                });
            }
        }
        ///两个 tcp 连接 交换数据,一发一收
        public void SwapMsg(object obj)
        {
            thSock mSocket = (thSock)obj;
            while (true)
            {
                try
                {
                    byte[] result = new byte[1024];
                    int num = mSocket.tcp2.Receive(result, result.Length,SocketFlags.None);
                    if (num == 0) //接受空包关闭连接
                    {
                        if (mSocket.tcp1.Connected)
                        {
                            mSocket.tcp1.Close();
                        }
                        if (mSocket.tcp2.Connected)
                        {
                            mSocket.tcp2.Close();
                        }
                        break;
                    }
                    mSocket.tcp1.Send(result, num, SocketFlags.None);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    if (mSocket.tcp1.Connected)
                    {
                        mSocket.tcp1.Close();
                    }
                    if (mSocket.tcp2.Connected)
                    {
                        mSocket.tcp2.Close();
                    }
                    break;
                }
            }
        }

    }

    public class thSock
    {
        public Socket tcp1 { get; set; }
        public Socket tcp2 { get; set; }
    }

猜你喜欢

转载自blog.csdn.net/jiegemena/article/details/79923386