业务需要跳转ip,又不想迁移程序,可以用此方法进行端口转发
static void Main(string[] args)
{
var dk = new DuanKou("0.0.0.0",8080,"0.0.0.0",80);
dk.Run();
Console.ReadKey();
}
public class DuanKou
{
int localProt { get; set; }
string localIp { get; set; }
int TargetPort { get; set; }
string TargetIp { get; set; }
public DuanKou(string localIp,int localProt, string TargetIp, int TargetPort)
{
this.localIp = localIp;
this.localProt = localProt;
this.TargetIp = TargetIp;
this.TargetPort = TargetPort;
}
public DuanKou()
{
this.localIp = "0.0.0.0" ;
this.localProt = 8080;
this.TargetIp = "0.0.0.0";
this.TargetPort = 80;
}
public void Run()
{
IPAddress ip = IPAddress.Parse(localIp);
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ;
serverSocket.Bind(new IPEndPoint(ip, localProt));
serverSocket.Listen(10000);
Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
Thread myThread = new Thread(Listen);
myThread.Start(serverSocket);
}
private void Listen(object obj)
{
Socket serverSocket = (Socket)obj;
IPAddress ip = IPAddress.Parse(TargetIp);
while (true)
{
Socket tcp1 = serverSocket.Accept();
Socket tcp2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcp2.Connect(new IPEndPoint(ip, TargetPort));
ThreadPool.QueueUserWorkItem(new WaitCallback(SwapMsg), new thSock
{
tcp1 = tcp2,
tcp2 = tcp1
});
ThreadPool.QueueUserWorkItem(new WaitCallback(SwapMsg), new thSock
{
tcp1 = tcp1,
tcp2 = tcp2
});
}
}
public void SwapMsg(object obj)
{
thSock mSocket = (thSock)obj;
while (true)
{
try
{
byte[] result = new byte[1024];
int num = mSocket.tcp2.Receive(result, result.Length,SocketFlags.None);
if (num == 0)
{
if (mSocket.tcp1.Connected)
{
mSocket.tcp1.Close();
}
if (mSocket.tcp2.Connected)
{
mSocket.tcp2.Close();
}
break;
}
mSocket.tcp1.Send(result, num, SocketFlags.None);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
if (mSocket.tcp1.Connected)
{
mSocket.tcp1.Close();
}
if (mSocket.tcp2.Connected)
{
mSocket.tcp2.Close();
}
break;
}
}
}
}
public class thSock
{
public Socket tcp1 { get; set; }
public Socket tcp2 { get; set; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)