点晴MIS内部交流论坛加入收藏
新手上路
论坛搜索
 您的位置:点晴MIS系统问题答疑『 技术文档交流 』浏览当前帖子  
登 陆注 册论坛帮助  

  网站搜索
  搜索范围: 搜索方式: 关键词(可用空格分开)  

  作者及文章信息: 本文热度:142 % 
admin

积分:75637
等级:网站管理员
文数:12345
注册:2004-7-20

 信息   留言   主页   编辑   引用    

楼 顶 

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


gYP.Start() 方法调用后填写一台公网主机IP(192.168.0.225)和端口(51),然后公网主机用lcx转发51到510端口,远程桌面在公网主机连自己(127.0.0.1:510)的510端口,就可以了。

源码附件:testPortTransfer.rar 附件:lcx.rar


主窗口:FrmPortTransfer.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace testPortTransfer
{
    public partial class FrmPortTransfer : Form
    {
        public string exePath = System.Windows.Forms.Application.StartupPath;  //本程序所在路径
        public int closeLcx = 0;
        public FrmPortTransfer()
        {
            InitializeComponent();
        }
        
        protected void tYoZ(object sender, EventArgs e)
        {
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = false;
            btnStart.Text = "执行中...";
            btnStop.Enabled = true;
            if (llH.Text.Length < 7 || ZHS.Text == "" || eEpm.Text.Length < 7 || iXdh.Text == "") return;
            Public.RemoteIP = llH.Text;                               //远程IP
            Public.RemotePort = ZHS.Text;                             //远程端口
            Public.LocalIP = eEpm.Text;                               //本地IP
            Public.LocalPort = iXdh.Text;                             //本地端口
            Public.StopServiceFlag = 1;                               //执行状态,0-停止、1-执行中
            PortForward gYP = new PortForward();
            gYP.Start(Public.RemoteIP, int.Parse(Public.RemotePort), Public.LocalIP, int.Parse(Public.LocalPort));
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = true;
            btnStart.Text = "启动";
            btnStop.Enabled = false;
            Public.StopServiceFlag = 0;
            PortForward gYP = new PortForward();
            gYP.lyTOK();
        }

        private void btnServerStart_Click(object sender, EventArgs e)
        {
            btnServerStart.Enabled = false;
            btnServerStart.Text = "执行中...";
            btnServerStop.Enabled = true;
            closeLcx = 1;
            btnServerStop_Click(sender, e);
            Thread.Sleep(1000);
            string FilePath = (exePath + @"\lcx.exe").Replace(@"\\", @"\");
            if (File.Exists(FilePath))
            {
                Process.Start(FilePath, " -listen " + txtServerInPort.Text + " " + txtServerOutPort.Text);
            }
            else
            {
                MessageBox.Show("启动应用程序失败:“" + FilePath + "”不存在!", "系统提醒", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnServerStop_Click(object sender, EventArgs e)
        {
            if (closeLcx == 0)
            {
                DialogResult result = MessageBox.Show("您确定要关闭LCX服务吗?", "确认关闭", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                if (result != DialogResult.OK){ return; }
                btnServerStart.Enabled = true;
                btnServerStart.Text = "启动";
                btnServerStop.Enabled = false;
            }
            closeLcx = 0;
            string FilePath = (exePath + @"\lcx.exe").Replace(@"\\", @"\");
            if (File.Exists(FilePath))
            {
                //停止后台服务程序
                try
                {
                    string CSFilePath = FilePath.ToLower();
                    if (File.Exists(CSFilePath))
                    {
                        Process[] myProcesses = Process.GetProcessesByName("lcx");
                        foreach (Process myProcess in myProcesses)
                        {
                            if (CSFilePath == myProcess.MainModule.FileName.ToLower())
                            {
                                Process p = Process.GetProcessById(myProcess.Id);
                                p.Kill();
                                break;
                            }
                        }
                    }
                }
                catch (Exception) { }
            }
        }
    }

    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];
            IPAddress rmt = IPAddress.Parse(host);
            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)
        {
            if (Public.StopServiceFlag == 0) { return; }
            try
            {
                session RKXy = new session();
                RKXy.ldel = ltcpClient;
                RKXy.rdel = rtcpClient;
                ltcpClient.BeginConnect(mtJ(Localaddress, LocalPort), new AsyncCallback(VTp), RKXy);
            }
            catch (Exception ex)
            {
                PortForward gYP = new PortForward();
                gYP.Start(Public.RemoteIP, int.Parse(Public.RemotePort), Public.LocalIP, int.Parse(Public.LocalPort));
            }
        }


        protected void VTp(IAsyncResult ar)
        {
            if (Public.StopServiceFlag == 0) { return; }
            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)
            {
                PortForward gYP = new PortForward();
                gYP.Start(Public.RemoteIP, int.Parse(Public.RemotePort), Public.LocalIP, int.Parse(Public.LocalPort));
            }
        }
        private void LFYM(IAsyncResult ar)
        {
            if (Public.StopServiceFlag == 0) { return; }
            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)
            {
                PortForward gYP = new PortForward();
                gYP.Start(Public.RemoteIP, int.Parse(Public.RemotePort), Public.LocalIP, int.Parse(Public.LocalPort));
            }
        }
        private void JTcp(IAsyncResult ar)
        {
            if (Public.StopServiceFlag == 0) { return; }
            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)
            {
                PortForward gYP = new PortForward();
                gYP.Start(Public.RemoteIP, int.Parse(Public.RemotePort), Public.LocalIP, int.Parse(Public.LocalPort));
            }
        }
        private void xPS(IAsyncResult ar)
        {
            if (Public.StopServiceFlag == 0){ return; }
            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)
            {
                PortForward gYP = new PortForward();
                gYP.Start(Public.RemoteIP, int.Parse(Public.RemotePort), Public.LocalIP, int.Parse(Public.LocalPort));
            }
        }
        private void IZU(IAsyncResult ar)
        {
            if (Public.StopServiceFlag == 0) { return; }
            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)
            {
                PortForward gYP = new PortForward();
                gYP.Start(Public.RemoteIP, int.Parse(Public.RemotePort), Public.LocalIP, int.Parse(Public.LocalPort));
            }
        }
        public void lyTOK()
        {
            try
            {
                if (ltcpClient != null)
                {
                    ltcpClient.Close();
                }
                if (rtcpClient != null)
                    rtcpClient.Close();
            }
            catch (Exception ex) { }
        }
    }
}

类:Public.cs
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace testPortTransfer
{
    class Public
    {
        public static string RemoteIP = "";                              //远程IP
        public static string RemotePort = "";                            //远程端口
        public static string LocalIP = "";                               //本地IP
        public static string LocalPort = "";                             //本地端口
        public static int StopServiceFlag = 0;                           //执行状态,0-停止、1-执行中
    }
}

该文章在 2021/6/10 10:37:35 编辑过

  离 线  2021/6/10 10:28:47 
  本文章共有 0 页, 0 张回文,每页有 10 张回文 >> [ ]
页码:
Copyright 2003-2021 ClickSun All Rights Reserved