C# 端口转发

业务需要跳转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; }
    }
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 中实现端口转发可以使用 TcpListener 和 TcpClient 类,而断点传输文件可以使用 FileStream 和 BinaryReader/BinaryWriter 类。 以下是一个简单的示例代码,演示了如何在本地端口监听并转发传入的连接: ```csharp using System; using System.IO; using System.Net; using System.Net.Sockets; class PortForwarder { static void Main(string[] args) { int localPort = 1234; // 本地监听端口 string remoteHost = "example.com"; // 转发目标主机 int remotePort = 5678; // 转发目标端口 TcpListener listener = new TcpListener(IPAddress.Any, localPort); listener.Start(); Console.WriteLine("Listening on port " + localPort); while (true) { TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("Accepted connection from " + client.Client.RemoteEndPoint); TcpClient remoteClient = new TcpClient(remoteHost, remotePort); Console.WriteLine("Connected to remote host " + remoteHost + ":" + remotePort); // 开启一个后台线程,将两个连接之间的数据进行转发 System.Threading.Thread thread = new System.Threading.Thread(() => { try { using (var localStream = client.GetStream()) using (var remoteStream = remoteClient.GetStream()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = localStream.Read(buffer, 0, buffer.Length)) > 0) { remoteStream.Write(buffer, 0, bytesRead); } } } catch (Exception ex) { Console.WriteLine("Error: " + ex.ToString()); } finally { client.Dispose(); remoteClient.Dispose(); } }); thread.IsBackground = true; thread.Start(); } } } ``` 要实现断点传输文件,可以根据需要进行读取和写入文件的偏移量,并在 TcpClient 之间进行数据传输。以下是一个简单的示例代码: ```csharp using System; using System.IO; using System.Net; using System.Net.Sockets; class FileTransfer { static void Main(string[] args) { string localFilePath = "localfile.dat"; // 本地文件路径 string remoteHost = "example.com"; // 文件接收主机 int remotePort = 5678; // 文件接收端口 long offset = 0; // 起始偏移量 TcpClient client = new TcpClient(remoteHost, remotePort); Console.WriteLine("Connected to remote host " + remoteHost + ":" + remotePort); using (var fileStream = new FileStream(localFilePath, FileMode.Open, FileAccess.Read)) using (var reader = new BinaryReader(fileStream)) using (var writer = new BinaryWriter(client.GetStream())) { // 将文件读取指定偏移量 fileStream.Seek(offset, SeekOrigin.Begin); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = reader.Read(buffer, 0, buffer.Length)) > 0) { writer.Write(buffer, 0, bytesRead); offset += bytesRead; Console.WriteLine("Sent " + bytesRead + " bytes at offset " + offset); } } client.Dispose(); } } ``` 注意,以上代码仅为示例,实际应用中需要考虑错误处理、超时、流关闭等情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值