受欢迎的博客标签

C#编写内网穿透程序 - TcpListener

Published

 

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