c# 实现端口转发可以用来实现远程桌面连接内网主机

gYP.Start()方法调用后填写一台公网主机ip和端口(11111)然后公网主机用lcx转发11111到22222端口,远程桌面在公网主机连自己(127.0.0.1:22222)的22222端口就可以了可能需要点2次连接
 protected void wDZ(object sender, EventArgs e)
        {
            if (iXdh.Text == "" || eEpm.Text.Length < 7 || ZHS.Text == "") return;
            PortForward gYP = new PortForward();
            gYP.Start(llH.Text, int.Parse(ZHS.Text), eEpm.Text, int.Parse(iXdh.Text));          
        }

        protected void vJNsE(object sender, EventArgs e)
        {
            PortForward gYP = new PortForward();
            gYP.lyTOK();
           
        }
        protected void tYoZ(object sender, EventArgs e)
        {
        }
    }
   
    public class PortForward
    {
        public string Localaddress;
        public int LocalPort;
        public string RemoteAddress;
        public int RemotePort;
        string type;
        Socket ltcpClient;
        Socket rtcpClient;
        Socket server;
        byte[] DPrPL = new byte[2048];
        byte[] wvZv = new byte[2048];
        public struct session
        {
            public Socket rdel;
            public Socket ldel;
            public int llen;
            public int rlen;
        }
        public static IPEndPoint mtJ(string host, int port)
        {
            IPEndPoint iep = null;
            IPHostEntry aGN = Dns.Resolve(host);
            IPAddress rmt = aGN.AddressList[0];
            iep = new IPEndPoint(rmt, port);
            return iep;
        }
        public void Start(string Rip, int Rport, string lip, int lport)
        {
            try
            {
                LocalPort = lport;
                RemoteAddress = Rip;
                RemotePort = Rport;
                Localaddress = lip;
                rtcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                ltcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                rtcpClient.BeginConnect(mtJ(RemoteAddress, RemotePort), new AsyncCallback(iiGFO), rtcpClient);
            }
            catch (Exception ex) { }
        }

        protected void iiGFO(IAsyncResult ar)
        {
            try
            {
                session RKXy = new session();
                RKXy.ldel = ltcpClient;
                RKXy.rdel = rtcpClient;
                ltcpClient.BeginConnect(mtJ(Localaddress, LocalPort), new AsyncCallback(VTp), RKXy);
            }
            catch (Exception ex) { }
        }


        protected void VTp(IAsyncResult ar)
        {
            try
            {
                session RKXy = (session)ar.AsyncState;
                ltcpClient.EndConnect(ar);
                RKXy.rdel.BeginReceive(DPrPL, 0, DPrPL.Length, SocketFlags.None, new AsyncCallback(LFYM), RKXy);
                RKXy.ldel.BeginReceive(wvZv, 0, wvZv.Length, SocketFlags.None, new AsyncCallback(xPS), RKXy);
            }
            catch (Exception ex) { }
        }
        private void LFYM(IAsyncResult ar)
        {
            try
            {
                session RKXy = (session)ar.AsyncState;
                int Ret = RKXy.rdel.EndReceive(ar);
                if (Ret > 0)
                    ltcpClient.BeginSend(DPrPL, 0, Ret, SocketFlags.None, new AsyncCallback(JTcp), RKXy);
                else lyTOK();
            }
            catch (Exception ex) { }
        }
        private void JTcp(IAsyncResult ar)
        {
            try
            {
                session RKXy = (session)ar.AsyncState;
                RKXy.ldel.EndSend(ar);
                RKXy.rdel.BeginReceive(DPrPL, 0, DPrPL.Length, SocketFlags.None, new AsyncCallback(this.LFYM), RKXy);
            }
            catch (Exception ex) { }
        }
        private void xPS(IAsyncResult ar)
        {
            try
            {
                session RKXy = (session)ar.AsyncState;
                int Ret = RKXy.ldel.EndReceive(ar);
                if (Ret > 0)
                    RKXy.rdel.BeginSend(wvZv, 0, Ret, SocketFlags.None, new AsyncCallback(IZU), RKXy);
                else lyTOK();
            }
            catch (Exception ex) { }
        }
        private void IZU(IAsyncResult ar)
        {
            try
            {
                session RKXy = (session)ar.AsyncState;
                RKXy.rdel.EndSend(ar);
                RKXy.ldel.BeginReceive(wvZv, 0, wvZv.Length, SocketFlags.None, new AsyncCallback(this.xPS), RKXy);
            }
            catch (Exception ex) { }
        }
        public void lyTOK()
        {
            try
            {
                if (ltcpClient != null)
                {
                    ltcpClient.Close();
                }
                if (rtcpClient != null)
                    rtcpClient.Close();
            }
            catch (Exception ex) { }
        }
    }
}


C#可以通过使用System.Windows.Forms命名空间中的AxMsRdpClientNotSafeForScripting类来实现RDP远程桌面连接。首先,你需要在项目中添加对AxMsRdpClientNotSafeForScripting的引用。然后,你可以在代码中创建一个AxMsRdpClientNotSafeForScripting对象,并设置连接所需的属性,如服务器地址、用户名和密码等。最后,调用Connect方法来建立远程桌面连接。以下是一个简单的示例代码: ```csharp using System; using System.Windows.Forms; using AxMSTSCLib; namespace RDPExample { public partial class Form1 : Form { private AxMsRdpClientNotSafeForScripting rdpClient; public Form1() { InitializeComponent(); rdpClient = new AxMsRdpClientNotSafeForScripting(); this.Controls.Add(rdpClient); } private void Form1_Load(object sender, EventArgs e) { rdpClient.Server = "服务器地址"; rdpClient.UserName = "用户名"; rdpClient.AdvancedSettings2.ClearTextPassword = "密码"; rdpClient.Connect(); } } } ``` 请注意,这只是一个简单的示例,你可能需要根据你的实际需求进行更多的设置和错误处理。同时,你还需要确保你的项目中已经添加了对AxInterop.MSTSCLib.dll和Interop.MSTSCLib.dll的引用,这些文件可以在安装了远程桌面客户端的计算机上找到。 #### 引用[.reference_title] - *1* [C# 实现RDP远程桌面连接](https://blog.csdn.net/weixin_43552645/article/details/105231489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C# 远程RDP共享桌面,控制桌面,远程桌面登录注销,用户切换,包括客户端,服务端软件及代码](https://blog.csdn.net/kxm675312877/article/details/125082369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值