using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace PortTresferClient
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
args = new string[] {"8099","localhost","3389" };
}
TcpListener tl = new TcpListener(int.Parse(args[0]));//这里开对方可以被你连接并且未被占用的端口
tl.Start();
while (true)//这里必须用循环,可以接收不止一个客户,因为我发现终端服务有时一个端口不行就换一个端口重连
{
//下面的意思就是一旦程序收到你发送的数据包后立刻开2个线程做中转
try
{
TcpClient tc1 = tl.AcceptTcpClient();//这里是等待数据再执行下边,不会100%占用cpu
TcpClient tc2 = new TcpClient(args[1], int.Parse(args[2]));
tc1.SendTimeout = 300000;//设定超时,否则端口将一直被占用,即使失去连接
tc1.ReceiveTimeout = 300000;
tc2.SendTimeout = 300000;
tc2.ReceiveTimeout = 300000;
object obj1 = (object)(new TcpClient[] { tc1, tc2 });
object obj2 = (object)(new TcpClient[] { tc2, tc1 });
ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj1);
ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj2);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
public static void transfer(object obj)
{
TcpClient tc1 = ((TcpClient[])obj)[0];
TcpClient tc2 = ((TcpClient[])obj)[1];
NetworkStream ns1 = tc1.GetStream();
NetworkStream ns2 = tc2.GetStream();
while (true)
{
try
{
//这里必须try catch,否则连接一旦中断程序就崩溃了,要是弹出错误提示让机主看见那就囧了
byte[] bt = new byte[10240];
int count = ns1.Read(bt, 0, bt.Length);
ns2.Write(bt, 0, count);
Console.WriteLine("From:" + tc1.Client.RemoteEndPoint.ToString() + "\tTo:" + tc2.Client.RemoteEndPoint.ToString() + "\t" + count + "bytes;");
}
catch
{
ns1.Dispose();
ns2.Dispose();
tc1.Close();
tc2.Close();
break;
}
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace PortTresferClient
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
args = new string[] {"8099","localhost","3389" };
}
TcpListener tl = new TcpListener(int.Parse(args[0]));//这里开对方可以被你连接并且未被占用的端口
tl.Start();
while (true)//这里必须用循环,可以接收不止一个客户,因为我发现终端服务有时一个端口不行就换一个端口重连
{
//下面的意思就是一旦程序收到你发送的数据包后立刻开2个线程做中转
try
{
TcpClient tc1 = tl.AcceptTcpClient();//这里是等待数据再执行下边,不会100%占用cpu
TcpClient tc2 = new TcpClient(args[1], int.Parse(args[2]));
tc1.SendTimeout = 300000;//设定超时,否则端口将一直被占用,即使失去连接
tc1.ReceiveTimeout = 300000;
tc2.SendTimeout = 300000;
tc2.ReceiveTimeout = 300000;
object obj1 = (object)(new TcpClient[] { tc1, tc2 });
object obj2 = (object)(new TcpClient[] { tc2, tc1 });
ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj1);
ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj2);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
public static void transfer(object obj)
{
TcpClient tc1 = ((TcpClient[])obj)[0];
TcpClient tc2 = ((TcpClient[])obj)[1];
NetworkStream ns1 = tc1.GetStream();
NetworkStream ns2 = tc2.GetStream();
while (true)
{
try
{
//这里必须try catch,否则连接一旦中断程序就崩溃了,要是弹出错误提示让机主看见那就囧了
byte[] bt = new byte[10240];
int count = ns1.Read(bt, 0, bt.Length);
ns2.Write(bt, 0, count);
Console.WriteLine("From:" + tc1.Client.RemoteEndPoint.ToString() + "\tTo:" + tc2.Client.RemoteEndPoint.ToString() + "\t" + count + "bytes;");
}
catch
{
ns1.Dispose();
ns2.Dispose();
tc1.Close();
tc2.Close();
break;
}
}
}
}
}