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