F:\developer_frpcsharp\src\Frpcssharp.TcpListener.Server\Frpcssharp.TcpListener.Server.csproj
Frpcssharp.TcpListener.Server
using System;
using System.Net.Sockets;
using System.Net;
//https://www.iaspnetcore.com/blogpost-65ecb9bf4cc16d0284625219-c-write-an-intranet-penetration-program-tcplistener
//https://zhuanlan.zhihu.com/p/618978273
namespace Frpcssharp.TcpListener.Server
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int localPort = 8080; // 本地端口
            int remotePort = 80; // 远程端口
            string remoteHost = "http://example.com"; // 远程主机地址
            IPAddress localAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; // 获取本地IP地址
            TcpListener listener = new TcpListener(localAddress, localPort); // 监听本地端口
            listener.Start(); // 启动监听器
            Console.WriteLine("Listening on {0}:{1}...", localAddress, localPort);
            while (true)
            {
                TcpClient client = listener.AcceptTcpClient(); // 接受客户端连接
                Console.WriteLine("Accepted connection from {0}", client.Client.RemoteEndPoint);
                NetworkStream stream = client.GetStream(); // 获取网络流
                TcpClient remoteClient = new TcpClient(remoteHost, remotePort); // 连接远程主机
                Console.WriteLine("Connected to {0}:{1}", remoteHost, remotePort);
                NetworkStream remoteStream = remoteClient.GetStream(); // 获取远程网络流
                Console.WriteLine("Forwarding data...");
                ForwardData(stream, remoteStream); // 转发数据
                client.Close(); // 关闭客户端连接
                remoteClient.Close(); // 关闭远程主机连接
            }
        }
        static void ForwardData(NetworkStream source, NetworkStream destination)
        {
            byte[] buffer = new byte[4096]; // 缓冲区
            int bytesRead;
            while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0) // 从源流读取数据
            {
                destination.Write(buffer, 0, bytesRead); // 写入目标流
            }
        }
    }
}
Frpcssharp.TcpListener.Client
将本地端口8080上的所有连接转发到远程主机http://example.com的端口80上
using System.Net.Sockets;
using System.Net;
using System;
using System.IO;
//将本地端口8080上的所有连接转发到公共URL上:将本地端口8080上的所有连接转发到远程主机http://example.com的端口80上
namespace Frpcssharp.TcpListener.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            int localPort = 8080; // 本地端口
            string publicUrl = "http://example.com"; // 公共URL
            TcpListener listener = new TcpListener(IPAddress.Any, localPort); // 监听本地端口
            listener.Start();
            Console.WriteLine("Listening on {0}...", listener.LocalEndpoint);
            while (true)
            {
                TcpClient client = listener.AcceptTcpClient(); // 接受客户端连接
                Console.WriteLine("Accepted connection from {0}", client.Client.RemoteEndPoint);
                TcpClient server = new TcpClient(); // 连接公共URL
                server.Connect(publicUrl, 80);
                Console.WriteLine("Connected to {0}", publicUrl);
                Stream clientStream = client.GetStream();
                Stream serverStream = server.GetStream();
                byte[] buffer = new byte[1024];
                int bytesRead;
                do
                {
                    bytesRead = clientStream.Read(buffer, 0, buffer.Length); // 从客户端读取数据
                    serverStream.Write(buffer, 0, bytesRead); // 将数据写入服务器
                } while (bytesRead > 0);
                client.Close();
                server.Close();
                Console.WriteLine("Connection closed");
            }
        }
    }
}
https://zhuanlan.zhihu.com/p/618978273
