基本类库,和测试

This commit is contained in:
sin365 2022-08-26 16:08:40 +08:00
parent e641ba243a
commit 73f1a15018
6 changed files with 206 additions and 0 deletions

BIN
.vs/AxibugTransfer/v17/.suo Normal file

Binary file not shown.

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,147 @@
using System.Net.Sockets;
namespace AxibugTransfer.Tcp
{
public struct transferInfo
{
public int cfgIndex;
public int clientTransferIndex;
public TcpClient client1;
public TcpClient client2;
public TansferDir tansferDir;
public bool bNeedStatistics;
}
public enum TansferDir
{
Local2Target,
Target2Local,
}
public class TcpTransfer
{
#region
public static Dictionary<int, TcpTransfer> _DictTransInstance { get; private set; } = new Dictionary<int, TcpTransfer>();
public static Dictionary<int, (transferInfo, transferInfo)> _DictClientTancefer { get; private set; } = new Dictionary<int, (transferInfo, transferInfo)>();
public static int InstanceIndex = 0;
public static int ClientTransferIndex = 0;
public static void AddSendDataLenght(int index, long lenght)
{
if (_DictTransInstance.ContainsKey(index)) _DictTransInstance[index].m_SendDataLenght += lenght;
}
public static void AddReceiveDataLenght(int index, long lenght)
{
if (_DictTransInstance.ContainsKey(index)) _DictTransInstance[index].m_ReceiveDataLenght += lenght;
}
public static void AddClientTancefer(int Index, transferInfo totargetTansfer, transferInfo tolocalTansfer)
{
_DictClientTancefer[Index] = (tolocalTansfer, totargetTansfer);
}
public static void RemoveClientTancefer(int Index)
{
if(_DictClientTancefer.ContainsKey(Index))
_DictClientTancefer.Remove(Index);
}
#endregion
public TcpTransfer(int localPort, string targetIP, int targetPort, bool needStatistics = false)
{
m_InstanceIndex = InstanceIndex++;
m_LocalPort = localPort;
m_targetIP = targetIP;
m_targetPort = targetPort;
_DictTransInstance[m_InstanceIndex] = this;
Console.WriteLine($"实例{m_InstanceIndex}初始化,localPort {localPort},targetIP {targetIP},targetPort {targetPort},needStatistics {needStatistics}");
}
~TcpTransfer()
{
_DictTransInstance.Remove(m_InstanceIndex);
}
int m_InstanceIndex = 0;
long m_SendDataLenght = 0;
long m_ReceiveDataLenght = 0;
int m_LocalPort;
string m_targetIP;
int m_targetPort;
bool m_bNeedStatistics = false;
public void Start()
{
System.ComponentModel.BackgroundWorker hunterwork = new System.ComponentModel.BackgroundWorker();
hunterwork.DoWork += delegate (object sender, System.ComponentModel.DoWorkEventArgs e)
{
StartListener();
};
hunterwork.RunWorkerAsync();
}
private void StartListener()
{
TcpListener tl = new TcpListener(m_LocalPort);
tl.Start();
while (true)
{
try
{
TcpClient tc1 = tl.AcceptTcpClient();
TcpClient tc2 = new TcpClient(m_targetIP, m_targetPort);
tc1.SendTimeout = 30000;
tc1.ReceiveTimeout = 30000;
tc2.SendTimeout = 30000;
tc2.ReceiveTimeout = 30000;
transferInfo obj1 = new transferInfo() { client1 = tc1, client2 = tc2, cfgIndex = m_InstanceIndex, tansferDir = TansferDir.Local2Target, bNeedStatistics = m_bNeedStatistics };
transferInfo obj2 = new transferInfo() { client1 = tc2, client2 = tc1, cfgIndex = m_InstanceIndex, tansferDir = TansferDir.Target2Local, bNeedStatistics = m_bNeedStatistics };
AddClientTancefer(ClientTransferIndex++, obj1, obj2);
ThreadPool.QueueUserWorkItem(new WaitCallback(tcp_transfer), (object)obj1);
ThreadPool.QueueUserWorkItem(new WaitCallback(tcp_transfer), (object)obj2);
Console.WriteLine($"实例{m_InstanceIndex} 建立新的连接 {ClientTransferIndex},{tc1.Client.AddressFamily.ToString()}");
}
catch { }
}
}
public static void tcp_transfer(object obj)
{
transferInfo info = (transferInfo)obj;
NetworkStream ns1 = info.client1.GetStream();
NetworkStream ns2 = info.client2.GetStream();
while (true)
{
try
{
byte[] bt = new byte[10240];
int count = ns1.Read(bt, 0, bt.Length);
ns2.Write(bt, 0, count);
if (!info.bNeedStatistics) continue;
//统计
if (info.tansferDir == TansferDir.Local2Target)
TcpTransfer.AddSendDataLenght(info.cfgIndex, count);
else
TcpTransfer.AddReceiveDataLenght(info.cfgIndex, count);
}
catch
{
ns1.Dispose();
ns2.Dispose();
info.client1.Close();
info.client2.Close();
break;
}
}
TcpTransfer.RemoveClientTancefer(info.clientTransferIndex);
}
}
}

View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\AxibugTransfer.Tcp\AxibugTransfer.Tcp.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,5 @@
using AxibugTransfer.Tcp;
new TcpTransfer(80, "Your IP", 8080, true).Start();
Console.ReadLine();

31
AxibugTransfer.sln Normal file
View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AxibugTransfer.Tcp", "AxibugTransfer.Tcp\AxibugTransfer.Tcp.csproj", "{B5A89E34-0283-44CB-8683-8E41888CA949}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AxibugTransfer.Test", "AxibugTransfer.Test\AxibugTransfer.Test.csproj", "{A27FCE74-123D-477C-BB5B-2879D0B39D22}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B5A89E34-0283-44CB-8683-8E41888CA949}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B5A89E34-0283-44CB-8683-8E41888CA949}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B5A89E34-0283-44CB-8683-8E41888CA949}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B5A89E34-0283-44CB-8683-8E41888CA949}.Release|Any CPU.Build.0 = Release|Any CPU
{A27FCE74-123D-477C-BB5B-2879D0B39D22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A27FCE74-123D-477C-BB5B-2879D0B39D22}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A27FCE74-123D-477C-BB5B-2879D0B39D22}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A27FCE74-123D-477C-BB5B-2879D0B39D22}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {84359E7A-FB5F-429C-8CB2-5FA95276D856}
EndGlobalSection
EndGlobal