示例#1
0
 protected virtual void OnSocketReceiveData(IReceivePackage dataPackage)
 {
     if (SocketReceiveData != null)
     {
         SocketReceiveData(this, this, dataPackage);
     }
 }
示例#2
0
 private void ProcessFliterData(IReceivePackage dataPackage, SocketAsyncEventArgsEx saeaEx, IRunDevice dev)
 {
     if (dev == null || dev.Protocol == null || dev.Protocol.ReceiveFilter == null)
     {
         if (dataPackage.ListBytes == null)
         {
             dataPackage.ListBytes = new List <byte[]>();
         }
         byte[] data = saeaEx.Get();
         if (data.Length > 0)
         {
             LastActiveTime = DateTime.Now;
         }
         dataPackage.ListBytes.Add(data);
     }
     else
     {
         dataPackage.DeviceCode = dev.DeviceParameter.DeviceCode;
         IList <byte[]> listBytes = saeaEx.Get(dev.Protocol.ReceiveFilter);
         if (listBytes != null && listBytes.Count > 0)
         {
             LastActiveTime = DateTime.Now;
         }
         dataPackage.ListBytes = listBytes;
     }
 }
        private IRunDevice GetDeliveryDevice(IRunDevice[] devList, IReceivePackage dataPackage)
        {
            IRunDevice devRun = null;

            foreach (IRunDevice dev in devList)
            {
                bool isDelivery = false;
                if (this.Server.ServerConfig.DeliveryMode == DeliveryMode.DeviceIP)
                {
                    #region
                    isDelivery = String.CompareOrdinal(dev.DeviceParameter.NET.RemoteIP, dataPackage.RemoteIP) == 0 ? true : false;
                    #endregion
                }
                else if (this.Server.ServerConfig.DeliveryMode == DeliveryMode.DeviceCode)
                {
                    #region
                    foreach (RequestInfo ri in dataPackage.RequestInfos)
                    {
                        byte[] data = ri.Data;
                        if (data != null)
                        {
                            if (dev.Protocol != null &&
                                dev.Protocol.CheckData(data)
                                &&
                                String.CompareOrdinal(dev.Protocol.GetCode(data),
                                                      dev.DeviceParameter.DeviceCode) == 0)
                            {
                                isDelivery = true;
                            }
                            else
                            {
                                isDelivery = false;
                            }
                        }
                        else
                        {
                            isDelivery = false;
                        }

                        if (isDelivery)
                        {
                            break;
                        }
                    }

                    #endregion
                }

                if (isDelivery)
                {
                    devRun = dev;
                    break;
                }
            }
            return(devRun);
        }
示例#4
0
        private void ProcessReceive(SocketAsyncEventArgs e)
        {
            ISocketSession socketSession = (ISocketSession)e.UserToken;

            if (socketSession != null && socketSession.Client != null)
            {
                try
                {
                    if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
                    {
                        SocketAsyncEventArgsEx saeaEx = (SocketAsyncEventArgsEx)e;
                        if (saeaEx.NextOffset >= saeaEx.InitOffset + saeaEx.Capacity)
                        {
                            saeaEx.Reset();
                        }

                        saeaEx.DataLength += saeaEx.BytesTransferred;

                        IList <byte[]>  listBytes = InternalReceivePackage(saeaEx);
                        IReceivePackage rp        = InternalReceivePackageData(listBytes);

                        saeaEx.SetBuffer(saeaEx.ReceiveBuffer, saeaEx.NextOffset, saeaEx.InitOffset + saeaEx.Capacity - saeaEx.NextOffset);

                        OnSocketReceiveData(rp);

                        bool willRaiseEvent = socketSession.Client.ReceiveAsync(this.SocketAsyncProxy.SocketReceiveEventArgsEx);
                        if (!willRaiseEvent)
                        {
                            ProcessReceive(saeaEx);
                        }
                    }
                    else
                    {
                        OnCloseSocket();
                    }
                }
                catch (SocketException ex)
                {
                    OnCloseSocket();
                    this.Server.Logger.Error(true, ex.Message);
                }
                catch (Exception ex)
                {
                    this.Server.Logger.Error(true, ex.Message);
                }
            }
        }
示例#5
0
        private void socketChannel_SocketReceiveData(object source, ISocketSession socketSession, IReceivePackage dataPackage)
        {
            ISocketController netController = (ISocketController)ControllerManager.GetController(SocketController.ConstantKey);

            if (netController != null)
            {
                netController.Receive(socketSession, dataPackage);
            }
            else
            {
                Logger.Info(false, SocketController.ConstantKey + ",无法找到对应的网络控制器");
            }
        }
        /// <summary>
        /// 接收数据
        /// </summary>
        /// <param name="socketSession"></param>
        /// <param name="dataPackage"></param>
        public void Receive(ISocketSession socketSession, IReceivePackage dataPackage)
        {
            if (dataPackage.ListBytes == null || dataPackage.ListBytes.Count <= 0)
            {
                return;
            }

            IRunDevice[] list = this.Server.DeviceManager.GetDevices(CommunicateType.NET);
            if (list != null && list.Length > 0)
            {
                if (this.Server.ServerConfig.ControlMode == ControlMode.Loop ||
                    this.Server.ServerConfig.ControlMode == ControlMode.Self ||
                    this.Server.ServerConfig.ControlMode == ControlMode.Parallel)
                {
                    #region
                    IRunDevice dev = GetDeliveryDevice(list, dataPackage);
                    if (dev != null)
                    {
                        lock (dev.SyncLock)
                        {
                            foreach (byte[] data in dataPackage.ListBytes)
                            {
                                #region
                                try
                                {
                                    if (data == null)
                                    {
                                        dev.Run(socketSession.Key, socketSession.Channel, new byte[] { });
                                    }
                                    else
                                    {
                                        dev.Run(socketSession.Key, socketSession.Channel, data);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Server.Logger.Error(true, "", ex);
                                }

                                int counter = this.Server.DeviceManager.GetCounter(dev.DeviceParameter.DeviceID);
                                Interlocked.Decrement(ref counter);
                                if (counter < 0)
                                {
                                    Interlocked.Exchange(ref counter, 0);
                                }
                                this.Server.DeviceManager.SetCounter(dev.DeviceParameter.DeviceID, counter);
                                #endregion
                            }
                        }
                    }
                    #endregion
                }
                else if (this.Server.ServerConfig.ControlMode == ControlMode.Singleton)
                {
                    #region
                    try
                    {
                        lock (list[0].SyncLock)
                        {
                            foreach (byte[] data in dataPackage.ListBytes)
                            {
                                list[0].Run(socketSession.Key, (IChannel)socketSession, data);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Server.Logger.Error(true, "", ex);
                    }
                    #endregion
                }
            }
        }