Ejemplo n.º 1
0
        /// <summary>
        /// 工作子线程高级版(端口转发建立后,实际进行数据转发的线程)
        /// </summary>
        public static void transfer(object obj)
        {
            ThreadMessage threadMessage = (ThreadMessage)obj;

            try
            {
                threadCount++;
                //TcpClient tc1 = ((TcpClient[])obj)[0];
                //TcpClient tc2 = ((TcpClient[])obj)[1];
                TcpClient     tc1            = threadMessage.tc1;
                TcpClient     tc2            = threadMessage.tc2;
                NetworkStream ns1            = tc1.GetStream();
                NetworkStream ns2            = tc2.GetStream();
                double        start          = 0;
                double        end            = 0;
                Boolean       overSpeed      = false;
                int           overSpeedCount = 0;
                while (true)
                {
                    start = DateTime.Now.Subtract(DateTime.Parse("1970-1-1")).TotalMilliseconds;
                    int    count = 0;
                    byte[] bt    = new byte[3000000];

                    System.DateTime currentTime = new System.DateTime();
                    currentTime = System.DateTime.Now;
                    string strY = currentTime.ToString();

                    try
                    {
                        //=============
                        //这里必须try catch,否则连接一旦中断程序就崩溃了,要是弹出错误提示让机主看见那就囧了
                        count = ns1.Read(bt, 0, bt.Length);
                        ns2.Write(bt, 0, count);
                        //==============
                        if (bits < count)
                        {
                            bits = count;
                        }
                        Console.WriteLine(strY + " : " + threadMessage.type + "  length:" + bits + "  tc1:" + tc1.Connected + "  tc2:" + tc2.Connected);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(threadMessage.type + "线程<<<<<<<<<<<<<<" + ex.ToString());
                        Console.WriteLine(strY + " : " + threadMessage.type + "  length:" + bits + "  tc1:" + tc1.Connected + "  tc2:" + tc2.Connected);
                        threadCount--;
                        break;
                    }
                    end = DateTime.Now.Subtract(DateTime.Parse("1970-1-1")).TotalMilliseconds;
                    if ((end - start) <= 1 || count == 0)
                    {
                        if (overSpeedCount >= 50)
                        {
                            break;//无效线程死循环达到500次自动退出
                        }
                        else
                        {
                            if (!overSpeed)
                            {
                                overSpeed      = true;
                                overSpeedCount = 1;
                            }
                            else
                            {
                                overSpeedCount++;
                            }
                        }
                    }
                }
                threadCount--;
            }
            catch (Exception ex)
            {
                Console.WriteLine(threadMessage.type + "线程无法修复的错误<<<<<<<<<<<<<<" + ex.ToString());
            }
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            int     serverPort = int.Parse(INIhelp.GetValue("port"));
            Boolean offline    = false;

            if (INIhelp.GetValue("offline") == "true")
            {
                offline = true;
            }

            TcpListener tl = new TcpListener(serverPort);

            //IPEndPoint ipe = new IPEndPoint(serverPort);

            tl.Start();



            while (true)
            {
                try
                {
                    TcpClient tc1 = tl.AcceptTcpClient();//这里是等待数据再执行下边,不会100%占用cpu
                    Console.WriteLine("线程数:" + threadCount);

                    NetworkStream ns1   = tc1.GetStream();
                    byte[]        bt    = new byte[10240];
                    int           count = ns1.Read(bt, 0, bt.Length);
                    string        str   = System.Text.Encoding.UTF8.GetString(bt);

                    Hashtable message   = getMessages(str);
                    Hashtable reMessage = new Hashtable();
                    if ((string)message["TYPE"] == "LOGIN")
                    {
                        float ver = float.Parse((string)message["VER"]);
                        if (ver < float.Parse(INIhelp.GetValue("ver")))
                        {
                            reMessage.Add("TYPE", "LOGIN-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "客户端版本过低!当前版本 v" + ver + ",请更新至 v" + INIhelp.GetValue("ver"));
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                            continue;
                        }

                        if (!offline)
                        {
                            DataTable dt = queryUserLoginMessage((string)message["USER"]);
                            if (dt.Rows.Count <= 0)
                            {
                                reMessage.Add("TYPE", "LOGIN-RE");
                                reMessage.Add("RE_ANSWER", "FALSE");
                                reMessage.Add("RE_MESSAGE", "用户不存在!");
                                byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                ns1.Write(byteArray, 0, byteArray.Length);
                                continue;
                            }
                            String pwd      = dt.Rows[0]["PASSWORD"].ToString();
                            String username = dt.Rows[0]["userdesc"].ToString();
                            String inherit  = dt.Rows[0]["inherit"].ToString();
                            if ((string)message["PWD"] == pwd)
                            {
                                reMessage.Add("TYPE", "LOGIN-RE");
                                reMessage.Add("RE_ANSWER", "TRUE");
                                reMessage.Add("USERDESC", username);
                                if (inherit == "admin")
                                {
                                    reMessage.Add("INHERIT", "ADMIN");
                                }
                                else
                                {
                                    reMessage.Add("INHERIT", "USER");
                                }
                                byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                ns1.Write(byteArray, 0, byteArray.Length);
                            }
                            else
                            {
                                reMessage.Add("TYPE", "LOGIN-RE");
                                reMessage.Add("RE_ANSWER", "FALSE");
                                reMessage.Add("RE_MESSAGE", "密码错误!");
                                byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                ns1.Write(byteArray, 0, byteArray.Length);
                            }
                            continue;
                        }
                        else
                        {
                            if ((string)message["USER"] == "zdkj")
                            {
                                if ((string)message["PWD"] == "scyy@68669820")
                                {
                                    reMessage.Add("TYPE", "LOGIN-RE");
                                    reMessage.Add("RE_ANSWER", "TRUE");
                                    reMessage.Add("USERDESC", "离线管理账户");
                                    reMessage.Add("INHERIT", "ADMIN");
                                    byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                    ns1.Write(byteArray, 0, byteArray.Length);
                                }
                            }
                            else
                            {
                                reMessage.Add("TYPE", "LOGIN-RE");
                                reMessage.Add("RE_ANSWER", "FALSE");
                                reMessage.Add("RE_MESSAGE", "用户不存在!");
                                byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                ns1.Write(byteArray, 0, byteArray.Length);
                                continue;
                            }
                            continue;
                        }
                    }
                    else if ((string)message["TYPE"] == "CONNECT")
                    {
                        float ver = float.Parse((string)message["VER"]);
                        if (ver < float.Parse(INIhelp.GetValue("ver")))
                        {
                            reMessage.Add("TYPE", "CONNECT-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "客户端版本过低!当前版本 v" + ver + ",请更新至 v" + INIhelp.GetValue("ver"));
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                            continue;
                        }

                        if (!offline)
                        {
                            DataTable dt = queryUserLicense((string)message["USER"], (string)message["PWD"], (string)message["TOTAL_IP"], (string)message["TOTAL_PORT"]);
                            if (int.Parse(dt.Rows[0]["License"].ToString()) <= 0)
                            {
                                reMessage.Add("TYPE", "CONNECT-RE");
                                reMessage.Add("RE_ANSWER", "FALSE");
                                reMessage.Add("RE_MESSAGE", "权限不足");
                                byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                ns1.Write(byteArray, 0, byteArray.Length);
                            }
                            else
                            {
                                try
                                {
                                    TcpClient     tc2            = new TcpClient((string)message["TOTAL_IP"], int.Parse((string)message["TOTAL_PORT"]));
                                    ThreadMessage threadMessage1 = new ThreadMessage();
                                    ThreadMessage threadMessage2 = new ThreadMessage();
                                    threadMessage1.TOTAL_IP   = (string)message["TOTAL_IP"];
                                    threadMessage2.TOTAL_IP   = (string)message["TOTAL_IP"];
                                    threadMessage1.TOTAL_PORT = (string)message["TOTAL_PORT"];
                                    threadMessage2.TOTAL_PORT = (string)message["TOTAL_PORT"];

                                    reMessage.Add("TYPE", "CONNECT-RE");
                                    reMessage.Add("RE_ANSWER", "TRUE");
                                    byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                    ns1.Write(byteArray, 0, byteArray.Length);


                                    threadMessage1.tc1  = tc1;
                                    threadMessage1.tc2  = tc2;
                                    threadMessage2.tc1  = tc2;
                                    threadMessage2.tc2  = tc1;
                                    threadMessage1.type = "user";
                                    threadMessage2.type = "target";
                                    //object obj1 = (object)(new TcpClient[] { tc1, tc2 });
                                    //object obj2 = (object)(new TcpClient[] { tc2, tc1 });
                                    object obj1 = (object)threadMessage1;
                                    object obj2 = (object)threadMessage2;
                                    ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj1);
                                    ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj2);
                                }
                                catch (Exception ex)
                                {
                                    reMessage.Add("TYPE", "CONNECT-RE");
                                    reMessage.Add("RE_ANSWER", "FALSE");
                                    reMessage.Add("RE_MESSAGE", ex.Message);
                                    byte[] byteArray1 = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                    ns1.Write(byteArray1, 0, byteArray1.Length);
                                    continue;
                                }
                                //TcpClient tc2 = new TcpClient("172.30.200.50", 3389);
                            }

                            continue;
                        }
                        else
                        {
                            try
                            {
                                TcpClient tc2 = new TcpClient((string)message["TOTAL_IP"], int.Parse((string)message["TOTAL_PORT"]));

                                reMessage.Add("TYPE", "CONNECT-RE");
                                reMessage.Add("RE_ANSWER", "TRUE");
                                byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                ns1.Write(byteArray, 0, byteArray.Length);

                                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)
                            {
                                reMessage.Add("TYPE", "CONNECT-RE");
                                reMessage.Add("RE_ANSWER", "FALSE");
                                reMessage.Add("RE_MESSAGE", ex.Message);
                                byte[] byteArray1 = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                                ns1.Write(byteArray1, 0, byteArray1.Length);
                                continue;
                            }
                            continue;
                        }
                    }
                    else if ((string)message["TYPE"] == "CHANGPWD")
                    {
                        float ver = float.Parse((string)message["VER"]);
                        if (ver < float.Parse(INIhelp.GetValue("ver")))
                        {
                            reMessage.Add("TYPE", "CHANGPWD-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "客户端版本过低!当前版本 v" + ver + ",请更新至 v" + INIhelp.GetValue("ver"));
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                            continue;
                        }

                        DataTable dt = queryUserLoginMessage((string)message["USER"]);
                        if (dt.Rows.Count <= 0)
                        {
                            reMessage.Add("TYPE", "CHANGPWD-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "用户不存在!");
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                            continue;
                        }
                        String pwd      = dt.Rows[0]["PASSWORD"].ToString();
                        String username = dt.Rows[0]["userdesc"].ToString();
                        String inherit  = dt.Rows[0]["inherit"].ToString();
                        if ((string)message["PWD"] == pwd)
                        {
                            updateUserPwd((string)message["USER"], (string)message["NEWPWD"]);
                            reMessage.Add("TYPE", "CHANGPWD-RE");
                            reMessage.Add("RE_ANSWER", "TRUE");
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                        }
                        else
                        {
                            reMessage.Add("TYPE", "CHANGPWD-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "原密码错误!");
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                        }
                    }
                    else if ((string)message["TYPE"] == "CHANGENAME")
                    {
                        float ver = float.Parse((string)message["VER"]);
                        if (ver < float.Parse(INIhelp.GetValue("ver")))
                        {
                            reMessage.Add("TYPE", "CHANGENAME-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "客户端版本过低!当前版本 v" + ver + ",请更新至 v" + INIhelp.GetValue("ver"));
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                            continue;
                        }

                        DataTable dt = queryUserLoginMessage((string)message["USER"]);
                        if (dt.Rows.Count <= 0)
                        {
                            reMessage.Add("TYPE", "CHANGENAME-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "用户不存在!");
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                            continue;
                        }
                        String pwd      = dt.Rows[0]["PASSWORD"].ToString();
                        String username = dt.Rows[0]["userdesc"].ToString();
                        String inherit  = dt.Rows[0]["inherit"].ToString();
                        if ((string)message["PWD"] == pwd)
                        {
                            updateUserName((string)message["USER"], (string)message["NEWDESC"]);
                            reMessage.Add("TYPE", "CHANGENAME-RE");
                            reMessage.Add("RE_ANSWER", "TRUE");
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                        }
                        else
                        {
                            reMessage.Add("TYPE", "CHANGENAME-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "原密码错误!");
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                        }
                    }
                    else if ((string)message["TYPE"] == "RESET-USER-PWD")
                    {
                        float ver = float.Parse((string)message["VER"]);
                        if (ver < float.Parse(INIhelp.GetValue("ver")))
                        {
                            reMessage.Add("TYPE", "RESET-USER-PWD-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "客户端版本过低!当前版本 v" + ver + ",请更新至 v" + INIhelp.GetValue("ver"));
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                            continue;
                        }

                        DataTable dt = queryUserLoginMessage((string)message["USER"]);
                        if (dt.Rows.Count <= 0)
                        {
                            reMessage.Add("TYPE", "RESET-USER-PWD-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "用户不存在!");
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                            continue;
                        }
                        String pwd      = dt.Rows[0]["PASSWORD"].ToString();
                        String username = dt.Rows[0]["userdesc"].ToString();
                        String inherit  = dt.Rows[0]["inherit"].ToString();
                        if ((string)message["PWD"] == pwd)
                        {
                            updateTargetUserPwd((string)message["TARGET-USER"]);
                            reMessage.Add("TYPE", "RESET-USER-PWD-RE");
                            reMessage.Add("RE_ANSWER", "TRUE");
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                        }
                        else
                        {
                            reMessage.Add("TYPE", "CHANGENAME-RE");
                            reMessage.Add("RE_ANSWER", "FALSE");
                            reMessage.Add("RE_MESSAGE", "你的密码错误!");
                            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(setMessages(reMessage));
                            ns1.Write(byteArray, 0, byteArray.Length);
                        }
                    }
                    else
                    {
                        continue;
                    }
                }
                catch (Exception ex)
                {
                    errorMessage(ex);
                }
            }
        }