端口转发源码

2 篇文章 0 订阅
2 篇文章 0 订阅
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;
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值