网站首页  软件下载  游戏下载  源码下载  词典软件  教程攻略

请输入您要查询的源码:

 

源码 TCP端口转发工具源码
图标
分类 源码下载-软件开发-C#源码-TCP端口转发 C#源码
语言 简体中文
大小 337KB
软件类型 国产软件
发布时间
用户评分 4
备案号
官方网址
软件授权 免费软件
操作系统 Windows平台
厂商
下载
介绍

TCP端口转发工具通过端口转发,协议透传,记录通讯协议日志

【核心代码】

#region 私有变量定义
        /// <summary>
        /// 服务端
        /// </summary>
        private TcpPullServer _serverSocket;
        /// <summary>
        /// 客户端
        /// </summary>
        private TcpPullClient _clientSocket;
        /// <summary>
        /// 连接的客户端IP地址
        /// </summary>
        private string netClientAddress;
        /// <summary>
        /// 连接的客户端端口号
        /// </summary>
        private int netClientPort;
        /// <summary>
        /// 网络是否连接成功
        /// </summary>
        private bool _isClientNet;
        /// <summary>
        /// 连接的客户端
        /// </summary>
        private List<IntPtr> _clientSockeList;
        #endregion
        public MainForm()
        {
            InitializeComponent();

            _clientSockeList = new List<IntPtr>();
        }

        #region TCP服务连接
        private HandleResult ServerErrors(IntPtr connId, SocketOperation enOperation, int errorCode)
        {
            if (errorCode <= 0) throw new ArgumentOutOfRangeException(nameof(errorCode));
            _serverSocket?.Disconnect(connId);
            return HandleResult.Ok;
        }

        private HandleResult ServerSocketAccept(IntPtr connId, IntPtr pClient)
        {
            _clientSockeList.Add(connId);
            string clientIp = string.Empty;
            ushort clientPort = 0;
            _serverSocket.GetRemoteAddress(connId, ref clientIp, ref clientPort);
            ShowNetDataMsg("客户端TCP连接", 0, $"连接地址:{clientIp},端口:{clientPort}");
            return HandleResult.Ok;
        }

        private HandleResult ServerSocketClose(IntPtr connId)
        {
            foreach (var item in _clientSockeList)
            {
                if (item == connId)
                {
                    _clientSockeList.Remove(item);
                    break;
                }
            }
            return HandleResult.Ok;
        }

        private HandleResult ServerRecvData(IntPtr connId, int length)
        {
            if (length >= 1)
            {
                IntPtr bufferPtr = Marshal.AllocHGlobal(length);
                try
                {
                    if (_serverSocket.Fetch(connId, bufferPtr, length) == FetchResult.Ok)
                    {
                        var recvBytes = ConvertHelper.IntptrToBytes(bufferPtr, length);
                        string recvString = ConvertHelper.BytesToHex(recvBytes);
                        var ip = string.Empty;
                        ushort port = 0;
                        _serverSocket.GetRemoteAddress(connId, ref ip, ref port);
                        ShowNetDataMsg($"接收,IP:{ip},端口:{port}", length, recvString);

                        if (!_isClientNet)
                        {
                            if (!string.IsNullOrEmpty(netClientAddress) && netClientPort > 0)
                            {
                                _isClientNet = _clientSocket.Connetion(netClientAddress, (ushort)netClientPort);
                            }
                        }
                        _clientSocket.GetListenAddress(ref ip, ref port);
                        _clientSocket.Send(recvBytes, length);
                        ShowNetDataMsg($"发送,IP:{ip},端口:{port}", length, recvString);
                    }
                }
                finally
                {
                    if (bufferPtr != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(bufferPtr);
                    }
                }
            }
            return HandleResult.Ok;
        }

        private HandleResult ServerSocketShutdown()
        {
            _isClientNet = false;

            return HandleResult.Ok;
        }
        #endregion

        #region TCP/IP客户端连接
        /// <summary>
        /// 与服务端成功建立连接时,Socket 监听器将收到该通知
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <returns></returns>
        protected HandleResult OnConnect(TcpClient sender)
        {
            _isClientNet = true;

            string serverIp = string.Empty;
            ushort serverPort = 0;
            _clientSocket.GetListenAddress(ref serverIp, ref serverPort);
            ShowNetDataMsg("服务端TCP连接", 0, $"连接地址:{serverIp},端口:{serverPort}");

            return HandleResult.Ok;
        }
        private HandleResult ClientErrors(TcpClient sender, SocketOperation enOperation, int errorCode)
        {
            if (errorCode <= 0) throw new ArgumentOutOfRangeException(nameof(errorCode));
            sender.Stop();
            return HandleResult.Ok;
        }

        private HandleResult ClientRecvData(TcpPullClient sender, int length)
        {
            if (length >= 5)
            {
                IntPtr bufferPtr = Marshal.AllocHGlobal(length);
                try
                {
                    if (sender.Fetch(bufferPtr, length) == FetchResult.Ok)
                    {
                        var recvBytes = ConvertHelper.IntptrToBytes(bufferPtr, length);
                        string recvString = ConvertHelper.BytesToHex(recvBytes);

                        var ip = string.Empty;
                        ushort port = 0;
                        sender.GetListenAddress(ref ip, ref port);
                        ShowNetDataMsg($"接收,IP:{ip},端口:{port}", length, recvString);
                        if (_clientSockeList.Count > 0)
                        {
                            foreach (var item in _clientSockeList)
                            {
                                _serverSocket.GetRemoteAddress(item, ref ip, ref port);
                                _serverSocket.Send(item, recvBytes, length);
                                ShowNetDataMsg($"发送,IP:{ip},端口:{port}", length, recvString);
                            }
                        }
                    }
                }
                finally
                {
                    if (bufferPtr != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(bufferPtr);
                    }
                }
            }
            return HandleResult.Ok;
        }
        #endregion

        //将信息显示到UI线程的方法
        private void ShowNetDataMsg(string state, int dataLen, string dataMsg)
        {
            NetRecviceMsg.BeginInvoke((MethodInvoker)delegate
            {
                var msgList = new StringBuilder();
                msgList.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} {state},数据长度:{dataLen}\r\n");
                msgList.Append($"数据内容:{dataMsg}\r\n");
                NetRecviceMsg.AppendText(msgList.ToString());

                if (NetRecviceMsg.Lines.GetUpperBound(0) >= 3000)
                {
                    LogHelper.WriteLog(NetRecviceMsg.Text);
                    NetRecviceMsg.Clear();
                }
            });
        }

        #region 文本框处理
        /// <summary>
        /// 只允许键盘输入数字
        /// 不包括“-”号
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void IntBackspace_KeyPress(object sender, KeyPressEventArgs e)
        {
            string pa = "[0-9]|\b"; //匹配数字与退格符
            Regex r = new Regex(pa);
            Match m = r.Match(e.KeyChar.ToString());
            if (m.Success)
                e.Handled = false;
            else
            {
                e.Handled = true;
            }
        }
        /// <summary>
        /// 只允许键盘输入数字
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void KeyBoardInt_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
            if ((e.KeyChar >= '0' && e.KeyChar <= '9') || (e.KeyChar == (char)8) || (e.KeyChar == '-'))
                e.Handled = false;
        }

        /// <summary>
        /// 允许键盘输入小数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <param name="wei">小数位数</param>
        protected void KeyBoardFloat_KeyPress(object sender, KeyPressEventArgs e, int wei)
        {
            if (char.IsNumber(e.KeyChar) || e.KeyChar == '.' || e.KeyChar == (char)Keys.Back ||
                e.KeyChar == (char)Keys.Delete)
            {
                e.Handled = false; //让操作生效  
                int j = 0;
                int k = 0;
                bool flag = false;
                if (((TextBox)sender).Text.Length == 0)
                {
                    if (e.KeyChar == '.')
                    {
                        e.Handled = true; //让操作失效  
                    }
                }

                int pPos = 0; //小数点位置
                for (int i = 0; i < ((TextBox)sender).Text.Length; i )
                {
                    if (((TextBox)sender).Text[i] == '.')
                    {
                        j ;
                        pPos = ((TextBox)sender).Text.IndexOf('.'); //获取当前小数点位置
                        flag = true;
                    }

                    if (flag)
                    {
                        if (char.IsNumber(((TextBox)sender).Text[i]) &&
                            (e.KeyChar != (char)Keys.Back || e.KeyChar == (char)Keys.Delete))
                        {
                            k = ((TextBox)sender).Text.Length - pPos;
                        }
                    }

                    if (j >= 1)
                    {
                        if (e.KeyChar == '.')
                        {
                            e.Handled = true; //让操作失效  
                        }
                    }

                    if (k > wei)
                    {
                        if (char.IsNumber(((TextBox)sender).Text[i]) && e.KeyChar != (char)Keys.Back)
                        {
                            if (((TextBox)sender).Text.Length - ((TextBox)sender).SelectionStart < wei 1)
                            {
                                if (((TextBox)sender).SelectedText != ((TextBox)sender).Text)
                                {
                                    e.Handled = true; ////让操作失效  
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                e.Handled = true;
            }
        }

        /// <summary>
        /// 判断文本框输入的IP地址是否合法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void TextBox_Leave(object sender, EventArgs e)
        {
            var regex = new Regex("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$");
            var blnTest = regex.IsMatch(((TextBox)sender).Text.Trim());
            if (blnTest)
            {
                string[] strTemp = ((TextBox)sender).Text.Trim().Split('.');
                for (int j = 0; j < strTemp.Length; j )
                {
                    if (Convert.ToInt32(strTemp[j]) > 255)
                    { //大于255则提示,不符合IP格式 
                        MessageBox.Show(this, @"存在不符合IP地址格式,请重新输入!", @"提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
                        if (((TextBox)sender).CanFocus)
                            ((TextBox)sender).Focus();
                        return;
                    }
                }
            }
            else
            {
                //输入非数字则提示,不符合IP格式 
                MessageBox.Show(this, @"存在不符合IP地址格式,请重新输入!", @"提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
                if (((TextBox)sender).CanFocus)
                    ((TextBox)sender).Focus();
            }
        }

        /// <summary>
        /// 光标始终放到最后位置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void TextBox_OnTextChanged(object sender, EventArgs e)
        {
            if (!(sender is TextBox textBox)) return;
            var str = textBox.Text;
            var len = Encoding.Default.GetByteCount(str);
            var maxlen = textBox.MaxLength;
            var bb = Encoding.Default.GetBytes(str);//得到输入的字符串的数组
            if (len <= maxlen) return;
            textBox.Text = Encoding.Default.GetString(bb, 0, maxlen);//将截断后的字节数组转换成字符串
            textBox.SelectionStart = maxlen;//将光标放置在输入文字的最后
        }

        private void ServerPort_KeyPress(object sender, KeyPressEventArgs e)
        {
            KeyBoardInt_KeyPress(sender, e);
        }

        private void ClientIP_Leave(object sender, EventArgs e)
        {
            TextBox_Leave(sender, e);
        }

        private void ClearMsg_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(NetRecviceMsg.Text))
                LogHelper.WriteLog(NetRecviceMsg.Text);
            NetRecviceMsg.Clear();
        }

        private void StartBtn_Click(object sender, EventArgs e)
        {
            netClientAddress = ClientIP.Text.Trim();
            netClientPort = ConvertHelper.ToInt(ConvertHelper.ReMoveBlank(ClientPort.Text));
            var netServerPort = ConvertHelper.ToInt(ConvertHelper.ReMoveBlank(ServerPort.Text));
            if (StartBtn.Text.Equals("启 动"))
            {
                _clientSocket = new TcpPullClient();
                _clientSocket.OnConnect = OnConnect;
                //接收到数据
                _clientSocket.OnReceive = ClientRecvData;
                //客户端已连出错
                _clientSocket.OnError = ClientErrors;

                if (!string.IsNullOrEmpty(netClientAddress) && netClientPort > 0)
                {
                    _isClientNet = _clientSocket.Connetion(netClientAddress, (ushort)netClientPort);
                }

                _serverSocket = new TcpPullServer
                {
                    IpAddress = "0.0.0.0",
                    Port = (ushort)netServerPort
                };
                //连接出错
                _serverSocket.OnError = ServerErrors;
                //客户端连接请求被接受后触发
                _serverSocket.OnAccept = ServerSocketAccept;
                //连接关闭后触发(服务端的连接通常是多个,只要某一个连接关闭了都会触发)
                _serverSocket.OnClose = ServerSocketClose;
                //接收到数据
                _serverSocket.OnReceive = ServerRecvData;
                //组件停止后触发
                _serverSocket.OnShutdown = ServerSocketShutdown;
                _serverSocket.Start();
                StartBtn.Text = "停 止";
            }
            else
            {
                if (_clientSocket != null)
                    _clientSocket.Stop();
                if (_serverSocket != null)
                    _serverSocket.Stop();
                StartBtn.Text = "启 动";
            }
        }
        #endregion

 

截图
随便看

 

网盟提供免费网站源码下载(asp源码,php源码,.net源码),源码动态,使用教程和源码评测;为站长推介有价值的源码,为开发者宣传源码作品。

 

Copyright © 2002-2024 cnnbu.com All Rights Reserved
更新时间:2025/4/7 12:27:28