protected virtual void OnSocketReceiveData(IReceivePackage dataPackage) { if (SocketReceiveData != null) { SocketReceiveData(this, this, dataPackage); } }
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); }
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); } } }
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 } } }