예제 #1
0
        private void ReadCallback(IAsyncResult ar)
        {
            WeaveNetWorkItems workItem = (WeaveNetWorkItems)ar.AsyncState;
            Socket            handler  = workItem.SocketSession;

            try
            {
                int bytesRead = 0;
                try
                {
                    bytesRead = handler.EndReceive(ar);
                }
                catch
                {
                    //netc.Soc.Close();
                    //listconn.Remove(netc);
                }
                byte[] tempbtye = new byte[bytesRead];
                if (bytesRead > 0)
                {
                    Array.Copy(workItem.Buffer, 0, tempbtye, 0, bytesRead);
                    workItem.DataList.Add(tempbtye);
                }
            }
            catch
            {
            }
            //handler.BeginReceive(netc.Buffer, 0, netc.BufferSize, 0, new AsyncCallback(ReadCallback), netc);
        }
예제 #2
0
 void ReceivePageHander(object ias)
 {
     while (true)
     {
         try
         {
             WeaveNetWorkItems[] netlist = new WeaveNetWorkItems[weaveNetworkItems.Count];
             weaveNetworkItems.CopyTo(netlist);
             foreach (WeaveNetWorkItems netc in netlist)
             {
                 if (netc.DataList.Count > 0)
                 {
                     if (!netc.IsPage)
                     {
                         netc.IsPage = true;
                         ThreadPool.QueueUserWorkItem(new WaitCallback(packageData), netc);
                         //System.Threading.Thread t = new System.Threading.Thread(new ParameterizedThreadStart(packageData));
                         //t.Start(netc);
                         //Webp2psever.packageDataHandler pdh = new Webp2psever.packageDataHandler(packageData);
                         //pdh.BeginInvoke(netc, endpackageData, null);
                     }
                 }
             }
             System.Threading.Thread.Sleep(10);
         }
         catch { }
     }
 }
        void AcceptHander(object ias)
        {
            var UpdateSocketListEventHandercback = new System.Threading.WaitCallback(UpdateSocketListEventHander);

            while (true)
            {
                Socket handler = socketLisener.Accept();
                //连接到服务器的客户端Socket封装类
                WeaveNetWorkItems netc = new WeaveNetWorkItems();
                if (Certificate != null)
                {
                    netc.Stream = Authenticate(handler, Certificate, SslProtocols.Default);
                    netc.Stream.AuthenticateAsServer(Certificate, false, SslProtocols.Tls, true);
                }

                netc.SocketSession = handler;
                weaveNetworkItems.Add(netc);
                if (Setherd(netc, 1))
                {
                    System.Threading.ThreadPool.QueueUserWorkItem(
                        UpdateSocketListEventHandercback,
                        handler);
                }
            }
        }
        void packageDataHander(WeaveNetWorkItems netc)
        {
            //  WeaveNetWorkItems netc= ar.AsyncState as WeaveNetWorkItems;
            // Console.WriteLine("packageDataHander:" + netc.allDataList.Length);
            netc.allDataList = packageData(netc.allDataList, netc.SocketSession, netc.Stream, netc.tempDataList);

            netc.IsPage = false;
            // Console.WriteLine("netc.IsPage:" + netc.IsPage);
        }
        void packageDataHanderobj(object obj)
        {
            WeaveNetWorkItems netc = obj as WeaveNetWorkItems;

            // Console.WriteLine("packageDataHanderobj:" + netc.allDataList.Length);
            netc.allDataList = packageData(netc.allDataList, netc.SocketSession, netc.Stream, netc.tempDataList);

            netc.IsPage = false;
            // Console.WriteLine("netc.IsPage:" + netc.IsPage);
        }
예제 #6
0
        void AcceptHander(object ias)
        {
            while (true)
            {
                Socket handler = socketLisener.Accept();
                //连接到服务器的客户端Socket封装类
                WeaveNetWorkItems netc = new WeaveNetWorkItems();
                netc.SocketSession = handler;
                weaveNetworkItems.Add(netc);

                System.Threading.ThreadPool.QueueUserWorkItem(
                    new System.Threading.WaitCallback(UpdateSocketListEventHander),
                    handler);
            }
        }
        private void ReadCallbackssl(object ar)
        {
            WeaveNetWorkItems netc   = (WeaveNetWorkItems)ar;
            SslStream         stream = netc.Stream;

            byte[] buffer = new byte[20480];
            //  StringBuilder messageData = new StringBuilder();
            int         byteCount = -1;
            List <byte> listb     = new List <byte>();

            do
            {
                byteCount = stream.Read(buffer, 0, buffer.Length);

                listb.AddRange(buffer.Take(byteCount));
            } while (byteCount <= 2);

            // netc.DataList.Add(listb.ToArray());
            netc.Buffer = listb.ToArray();
            if (netc.Buffer.Length <= 0)
            {
                netc.allDataList = packageData(netc.allDataList, netc.SocketSession, netc.Stream, netc.tempDataList);
                netc.IsPage      = false;
                //ar.AsyncWaitHandle.Close();
                return;
            }
            else
            {
                int    bytesRead = netc.Buffer.Length;
                byte[] tempbtye  = new byte[bytesRead];
                Array.Copy(netc.Buffer, 0, tempbtye, 0, tempbtye.Length);
                int    lle  = netc.allDataList.Length;
                byte[] temp = new byte[lle + tempbtye.Length];
                Array.Copy(netc.allDataList, 0, temp, 0, netc.allDataList.Length);
                Array.Copy(tempbtye, 0, temp, lle, bytesRead);
                netc.allDataList = temp; //workItem.DataList.Add(tempbtye)
                netc.allDataList = packageData(netc.allDataList, netc.SocketSession, netc.Stream, netc.tempDataList);
                netc.IsPage      = false;
                return;
            }
        }
예제 #8
0
 void ReceiveHander(object ias)
 {
     while (true)
     {
         try
         {
             int c     = weaveNetworkItems.Count;
             int count = (c / Partition) + 1;
             getbufferdelegate[] iagbd = new getbufferdelegate[count];
             IAsyncResult[]      ia    = new IAsyncResult[count];
             if (c > 0)
             {
                 WeaveNetWorkItems[] netlist = new WeaveNetWorkItems[c];
                 weaveNetworkItems.CopyTo(0, netlist, 0, c);
                 getbuffer(netlist, 0, Partition);
             }
         }
         catch { }
         System.Threading.Thread.Sleep(1);
     }
 }
예제 #9
0
        void KeepAliveHander(object obj)
        {
            while (true)
            {
                try
                {
                    WeaveNetWorkItems[] workItems = new WeaveNetWorkItems[weaveNetworkItems.Count];
                    weaveNetworkItems.CopyTo(workItems);
                    foreach (WeaveNetWorkItems workItem in workItems)
                    {
                        if (workItem == null)
                        {
                            continue;
                        }
                        Thread.Sleep(1);
                        try
                        {
                            byte[] b = new byte[] { 0x99 };
                            workItem.SocketSession.Send(b);
                            workItem.ErrorNum = 0;
                        }
                        catch
                        {
                            workItem.ErrorNum += 1;
                            if (workItem.ErrorNum > 3)
                            {
                                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(DeleteSocketListEventHander), workItem.SocketSession);


                                weaveNetworkItems.Remove(workItem);
                            }
                        }
                    }
                    Thread.Sleep(5000);
                    // GC.Collect();
                }
                catch { }
            }
        }
예제 #10
0
 void getbuffer(WeaveNetWorkItems[] netlist, int index, int len)
 {
     for (int i = index; i < len; i++)
     {
         if (i >= netlist.Length)
         {
             return;
         }
         try
         {
             WeaveNetWorkItems netc = netlist[i];
             if (netc.SocketSession != null)
             {
                 if (netc.SocketSession.Available > 0)
                 {
                     netc.SocketSession.BeginReceive(netc.Buffer = new byte[netc.SocketSession.Available], 0, netc.Buffer.Length, 0, new AsyncCallback(ReadCallback), netc);
                 }
             }
         }
         catch
         { }
     }
 }
예제 #11
0
        /// <summary>
        /// 对粘包,分包的处理方法
        /// </summary>
        /// <param name="obj"></param>
        private void packageData(object obj)
        {
            WeaveNetWorkItems netc     = obj as WeaveNetWorkItems;
            List <byte[]>     ListData = netc.DataList;

            try
            {
                int i     = 0;
                int count = ListData.Count;
                if (count > 0)
                {
                    int bytesRead = ListData[i] != null ? ListData[i].Length : 0;
                    if (bytesRead == 0)
                    {
                        if (ListData.Count > 0)
                        {
                            ListData.RemoveAt(0);
                        }
                        netc.IsPage = false; return;
                    }
                    ;
                    byte[] tempbtye = new byte[bytesRead];
                    Array.Copy(ListData[i], tempbtye, tempbtye.Length);
                    if (bytesRead > 2)
                    {
                        int a = tempbtye[1];
                        if (bytesRead > 2 + a)
                        {
                            int len = 0;
                            if (weaveDataType == WeaveDataTypeEnum.Bytes)
                            {
                                byte[] bb = new byte[a];
                                Array.Copy(tempbtye, 2, bb, 0, a);
                                len = ConvertToInt(bb);
                            }
                            else
                            {
                                String temp = System.Text.Encoding.UTF8.GetString(tempbtye, 2, a);
                                len = int.Parse(temp);
                            }
                            if ((len + 2 + a) > tempbtye.Length)
                            {
                                try
                                {
                                    if (ListData.Count > 1)
                                    {
                                        ListData.RemoveAt(i);
                                        byte[] temps = new byte[tempbtye.Length];
                                        Array.Copy(tempbtye, temps, temps.Length);
                                        byte[] tempbtyes = new byte[temps.Length + ListData[i].Length];
                                        Array.Copy(temps, tempbtyes, temps.Length);
                                        Array.Copy(ListData[i], 0, tempbtyes, temps.Length, ListData[i].Length);
                                        ListData[i] = tempbtyes;
                                    }
                                }
                                catch
                                {
                                }
                                netc.IsPage = false; return;
                            }
                            else if (tempbtye.Length > (len + 2 + a))
                            {
                                try
                                {
                                    byte[] temps = new byte[tempbtye.Length - (len + 2 + a)];
                                    Array.Copy(tempbtye, (len + 2 + a), temps, 0, temps.Length);
                                    ListData[i] = temps;
                                }
                                catch
                                { }
                                // netc.Ispage = false; return;
                            }
                            else if (tempbtye.Length == (len + 2 + a))
                            {
                                if (ListData.Count > 0)
                                {
                                    ListData.RemoveAt(i);
                                }
                            }
                            try
                            {
                                if (weaveDataType == WeaveDataTypeEnum.Json)
                                {
                                    String     temp = System.Text.Encoding.UTF8.GetString(tempbtye, 2 + a, len);
                                    WeaveEvent me   = new WeaveEvent();
                                    me.Command = tempbtye[0];
                                    me.Data    = temp;
                                    me.Soc     = netc.SocketSession;
                                    if (waveReceiveEvent != null)
                                    {
                                        System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ReceiveEventHander), me);
                                    }
                                    //receiveeventto(me);
                                    //if (receiveevent != null)
                                    //    receiveevent.BeginInvoke(tempbtye[0], temp, netc.Soc, null, null);
                                    //if (ListData.Count > 0) ListData.RemoveAt(i);
                                }
                                else if (weaveDataType == WeaveDataTypeEnum.Bytes)
                                {
                                    //  temp = System.Text.Encoding.UTF8.GetString(tempbtye, 2 + a, len);
                                    byte[] bs = new byte[len];
                                    Array.Copy(tempbtye, (2 + a), bs, 0, bs.Length);
                                    WeaveEvent me = new WeaveEvent();
                                    me.Command = tempbtye[0];
                                    me.Data    = "";
                                    me.Databit = bs;
                                    me.Soc     = netc.SocketSession;
                                    if (weaveReceiveBitEvent != null)
                                    {
                                        System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ReceiveBitEventHander), me);
                                    }
                                }
                                netc.IsPage = false; return;
                            }
                            catch //(Exception e)
                            {
                                netc.IsPage = false; return;
                            }
                        }
                        else
                        {
                            if (ListData.Count > 0)
                            {
                                ListData.RemoveAt(i);
                                byte[] temps = new byte[tempbtye.Length];
                                Array.Copy(tempbtye, temps, temps.Length);
                                byte[] tempbtyes = new byte[temps.Length + ListData[i].Length];
                                Array.Copy(temps, tempbtyes, temps.Length);
                                Array.Copy(ListData[i], 0, tempbtyes, temps.Length, ListData[i].Length);
                                ListData[i] = tempbtyes;
                            }
                            netc.IsPage = false; return;
                        }
                    }
                    else
                    {
                        try
                        {
                            if (ListData.Count > 1)
                            {
                                ListData.RemoveAt(i);
                                byte[] temps = new byte[tempbtye.Length];
                                Array.Copy(tempbtye, temps, temps.Length);
                                byte[] tempbtyes = new byte[temps.Length + ListData[i].Length];
                                Array.Copy(temps, tempbtyes, temps.Length);
                                Array.Copy(ListData[i], 0, tempbtyes, temps.Length, ListData[i].Length);
                                ListData[i] = tempbtyes;
                            }
                        }
                        catch
                        {
                        }
                        netc.IsPage = false; return;
                    }
                }
            }
            catch //(Exception e)
            {
                try
                {
                    if (netc.DataList.Count > 0)
                    {
                        netc.DataList.RemoveAt(0);
                    }
                    netc.IsPage = false;
                }
                catch { }
                return;
            }
            finally { netc.IsPage = false; }
        }
예제 #12
0
        bool getbuffer(List <WeaveNetWorkItems> netlist, int index, int len)
        {
            var bb = true;

            for (int i = index; i < len; i++)
            {
                if (i >= netlist.Count)
                {
                    return(bb);
                }
                try
                {
                    WeaveNetWorkItems netc = netlist[i];
                    if (netc.SocketSession != null)
                    {
                        if (netc.SocketSession.Available > 0 || netc.allDataList.Length > 0)
                        {
                            bb = false;
                        }
                        if (!netc.IsPage && Setherd(netc))
                        {
                            //  if (netc.SocketSession.Available > 0 || netc.allDataList.Length > 3)
                            if (Certificate != null)
                            {
                                SslStream sslStream = netc.Stream;
                                if (sslStream.IsAuthenticated)
                                {
                                    netc.IsPage = true;
                                    ThreadPool.QueueUserWorkItem(new WaitCallback(ReadCallbackssl), netc);
                                }
                            }
                            else
                            {
                                if (netc.SocketSession.Available > 0)
                                {
                                    dt          = DateTime.Now;
                                    netc.IsPage = true;
                                    // netc.SocketSession.ReceiveAsync
                                    // Console.WriteLine((netc.SocketSession.RemoteEndPoint as IPEndPoint).Address.ToString() + "+接收:" + netc.SocketSession.Available);
                                    netc.SocketSession.BeginReceive(netc.Buffer = new byte[netc.SocketSession.Available], 0, netc.Buffer.Length, 0, ReadCallbackasty, netc);
                                }
                                else if (netc.allDataList.Length > 0)
                                {
                                    dt          = DateTime.Now;
                                    netc.IsPage = true;
                                    // Console.WriteLine((netc.SocketSession.RemoteEndPoint as IPEndPoint).Address.ToString() + "+剩余:" + netc.allDataList.Length);
                                    // netc.SocketSession.ReceiveAsync
                                    System.Threading.ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(packageDataHanderobj), netc);
                                    // packageDatacall.BeginInvoke(netc, callBackMethod, packageDatacall);

                                    //netc.SocketSession.BeginReceive(netc.Buffer = new byte[netc.SocketSession.Available], 0, netc.Buffer.Length, 0, ReadCallbackasty, netc);
                                }
                                // // Console.WriteLine((netc.SocketSession.RemoteEndPoint as IPEndPoint).Address.ToString() + "+剩余:" + netc.allDataList.Length);
                            }
                        }
                    }
                }
                catch
                { }
            }
            return(bb);
        }
예제 #13
0
        private void ReadCallback(IAsyncResult ar)
        {
            WeaveNetWorkItems workItem = (WeaveNetWorkItems)ar.AsyncState;
            Socket            handler  = workItem.SocketSession;

            try
            {
                int bytesRead = 0;
                try
                {
                    bytesRead = handler.EndReceive(ar);
                    if (bytesRead <= 0)
                    {
                        if (workItem.allDataList.Length > 3)
                        {
                            workItem.allDataList = packageData(workItem.allDataList, workItem.SocketSession, workItem.Stream, workItem.tempDataList);
                        }
                        workItem.IsPage = false;
                        //DateTime dt3 = DateTime.Now;
                        //Console.WriteLine((dt3 - dt).TotalMilliseconds);
                        //ar.AsyncWaitHandle.Close();
                        return;
                    }
                }
                catch
                {
                    //netc.Soc.Close();
                    //listconn.Remove(netc);
                }

                bytesRead = workItem.Buffer.Length;
                byte[] tempbtye = new byte[bytesRead];
                //if (bytesRead > 0)
                {
                    Buffer.BlockCopy(workItem.Buffer, 0, tempbtye, 0, tempbtye.Length);


                    int lle = workItem.allDataList.Length;

                    byte[] temp = new byte[lle + tempbtye.Length];
                    Buffer.BlockCopy(workItem.allDataList, 0, temp, 0, workItem.allDataList.Length);
                    // Array.Copy(workItem.allDataList, 0, temp, 0, workItem.allDataList.Length);

                    Buffer.BlockCopy(tempbtye, 0, temp, lle, bytesRead);
                    workItem.allDataList = temp;         //workItem.DataList.Add(tempbtye);
                    workItem.allDataList = packageData(workItem.allDataList, workItem.SocketSession, workItem.Stream, workItem.tempDataList);
                    // Console.WriteLine((workItem.SocketSession.RemoteEndPoint as IPEndPoint).Address.ToString() + "+ReadCallback:" + workItem.allDataList.Length);
                    //if (workItem.SocketSession.Available > 0)
                    //{
                    //    workItem.SocketSession.BeginReceive(workItem.Buffer = new byte[workItem.SocketSession.Available], 0, workItem.Buffer.Length, 0, ReadCallbackasty, workItem);
                    //}
                    //else
                    workItem.IsPage = false;
                }
                //DateTime dt2 = DateTime.Now;
                //Console.WriteLine((dt2 - dt).TotalMilliseconds);
            }
            catch (Exception ee)
            {
                // Console.WriteLine("ReadCallback:" + ee.Message);
            }
        }
예제 #14
0
        protected virtual void KeepAliveHander(object obj)
        {
            var DeleteSocketListEventHandercallback = new System.Threading.WaitCallback(DeleteSocketListEventHander);

            while (true)
            {
                try
                {
                    WeaveNetWorkItems[] workItems = new WeaveNetWorkItems[weaveNetworkItems.Count];
                    weaveNetworkItems.CopyTo(workItems);
                    foreach (WeaveNetWorkItems workItem in workItems)
                    {
                        if (workItem == null)
                        {
                            continue;
                        }
                        //  Thread.Sleep(1);
                        try
                        {
                            byte[] b  = new byte[] { 0x99 };
                            var    ok = false;
                            if (!Setherd(workItem, 1))
                            {
                                ok = true;
                            }
                            else
                            {
                                if (Certificate != null)
                                {
                                    if (weaveDataType == WeaveDataTypeEnum.custom)
                                    {
                                        //    b = new byte[1];
                                        ok = Send(workItem.Stream, new byte[1]);
                                    }
                                    else
                                    {
                                        ok = Send(workItem.Stream, 0x99, b);
                                    }
                                }
                                else
                                {
                                    if (weaveDataType == WeaveDataTypeEnum.custom)
                                    {
                                        //    b = new byte[1];
                                        ok = Send(workItem.SocketSession, new byte[1]);
                                    }
                                    else
                                    {
                                        ok = Send(workItem.SocketSession, 0x99, b);
                                    }
                                }
                            }
                            // ok = Send(workItem.SocketSession, new byte[1]);
                            if (!ok)
                            {
                                workItem.ErrorNum += 1;
                                if (workItem.ErrorNum >= 1)
                                {
                                    System.Threading.ThreadPool.UnsafeQueueUserWorkItem(DeleteSocketListEventHandercallback, workItem.SocketSession);


                                    weaveNetworkItems.Remove(workItem);
                                }
                            }
                            else
                            {
                                workItem.ErrorNum = 0;
                            }

                            // workItem.SocketSession.Send(b);
                        }
                        catch
                        {
                            workItem.ErrorNum += 1;
                            if (workItem.ErrorNum >= 1)
                            {
                                System.Threading.ThreadPool.UnsafeQueueUserWorkItem(
                                    DeleteSocketListEventHandercallback,
                                    workItem.SocketSession);

                                try
                                {
                                    weaveNetworkItems.Remove(workItem);
                                }
                                catch (Exception EX_NAME)
                                {
                                    // Console.WriteLine(EX_NAME);
                                    //throw;
                                }
                            }
                        }
                    }
                    Thread.Sleep(5000);
                    GC.Collect();
                }
                catch { }
            }
        }
예제 #15
0
 protected virtual bool Setherd(WeaveNetWorkItems netc, int xintiao = 0)
 {
     return(true);
 }