Exemple #1
0
 public void Startup()
 {
     if (CurrentState != ServiceState.Stopped)
     {
         return;
     }
     try {
         _Startup();
         RuntimeErrorMessage = null;
         _started            = true;
         enabled             = true;
         ULogger.Info($"Service {serviceName} started");
         Started.Trigger();
     } catch (Exception e) {
         // 启动服务失败,若设置了自动重启间隔,则在指定间隔后尝试重启
         RuntimeErrorMessage = $"{e.GetType ().Name}: {e.Message}";
         _started            = false;
         enabled             = false;
         ULogger.Warning(
             $"Start service {serviceName} failed due to {RuntimeErrorMessage}");
         if (retryInterval != 0)
         {
             Invoke(nameof(Startup), retryInterval);
         }
     }
 }
Exemple #2
0
 public bool Send(Packet.Packet packet)
 {
     try {
         if (!IsRunning)
         {
             throw new ServiceException($"{serviceName} is not running.");
         }
         if (_client == null || !_client.Connected)
         {
             throw new ServiceException($"{serviceName} is not in connection.");
         }
         var packetData = packet.Data;
         var packetCode = _packetForwardService.GetPacketCode(typeof(T));
         var writer     = new _NetWriter(packetCode, packetData);
         writer.WriteNextSubPacket(new BinaryWriter(_client.GetStream()));
         if (showLog)
         {
             ULogger.Info($"<{serviceName}> {packet.GetType ().FullName} was sent.");
         }
         return(true);
     } catch (Exception e) {
         ULogger.Warning($"<{serviceName}> Send {packet.GetType ().FullName} failed.", e);
         return(false);
     }
 }
Exemple #3
0
 public bool Send(Packet.Packet packet)
 {
     try {
         if (!IsRunning)
         {
             throw new ServiceException($"{serviceName} is not running.");
         }
         var remoteEp   = new IPEndPoint(IPAddress.Parse(remoteIP), remotePort);
         var packetData = packet.Data;
         var packetCode = _packetForwardService.GetPacketCode(packet.GetType());
         var writer     = new _NetWriter(packetCode, packetData, _seq);
         while (true)
         {
             try {
                 _buffStream.Seek(0, SeekOrigin.Begin);
                 var bytesWritten =
                     writer.WriteNextSubPacket(new BinaryWriter(_buffStream));
                 _client.Send(_buffStream.GetBuffer(), (int)bytesWritten, remoteEp);
             } catch (EndOfStreamException) {
                 break;
             }
         }
         if (showLog)
         {
             ULogger.Info($"<{serviceName}> {packet.GetType ().FullName} was sent.");
         }
         return(true);
     } catch (Exception e) {
         ULogger.Warning($"<{serviceName}> Send {packet.GetType ().FullName} failed.", e);
         return(false);
     }
 }
Exemple #4
0
 /// <summary>
 /// 转发数据包至所有绑定的接收者。
 /// </summary>
 /// <param name="packet">数据包</param>
 /// <seealso cref="BindReceiver{T}"/>
 public void ForwardPacket(Packet packet)
 {
     if (!_handlers.TryGetValue(packet.GetType(), out var receivers))
     {
         ULogger.Warning($"{packet.GetType ().FullName} has not been set in protocal");
         return;
     }
     receivers?.Receive(packet);
 }
Exemple #5
0
 internal void DoMainLoop()
 {
     if (CurrentState != ServiceState.Running)
     {
         return;
     }
     try {
         _Update();
     } catch (Exception e) {
         RuntimeErrorMessage = $"{e.GetType ().Name}: {e.Message}";
         ULogger.Warning($"Service {serviceName} incurs {RuntimeErrorMessage}");
     }
 }
Exemple #6
0
 protected void _Receive()
 {
     try {
         while (_client.Available > 0)
         {
             var rawPacket = _netReader.Read(new BinaryReader(_client.GetStream()),
                                             _client.Available);
             if (rawPacket == null)
             {
                 continue;
             }
             rawPacket.remoteEP = (IPEndPoint)_client.Client.RemoteEndPoint;
             _packetForwardService.ForwardPacket(rawPacket);
         }
     } catch (Exception ex) {
         ULogger.Warning($"<{serviceName}> An error occurs when read packet data.", ex);
         _client?.GetStream().Seek(0, SeekOrigin.End);
     }
 }
        private void _UDPRead()
        {
            while (_client.Available != 0)
            {
                // 接收来自远程主机的数据子包,并获取来源地址
                var remoteEP = new IPEndPoint(IPAddress.Any, localPort);
                var data     = _client.Receive(ref remoteEP);
                // [LOG] UDP data length
                if (showLog)
                {
                    ULogger.Info($"<{serviceName}> Udp data received, length = {data.Length}");
                }

                // 获取或创建与远程主机绑定的数据包读取对象
                if (!_netReaders.TryGetValue(remoteEP, out var netReader))
                {
                    _netReaders.Add(remoteEP, netReader = _NetReader.Create(NetType.UDP));
                }

                // 读取并尝试组装子包
                _RawPacket rawPacket;
                try {
                    rawPacket = netReader.Read(new BinaryReader(new MemoryStream(data)),
                                               data.Length);
                } catch (Exception e) {
                    ULogger.Warning(
                        $"<{serviceName}> Received unrecognized or corrupted packet", e);
                    continue;
                }
                if (rawPacket == null)
                {
                    continue;
                }

                // 填入远程主机地址并分发数据包
                rawPacket.remoteEP = remoteEP;
                _packetForwardService.ForwardPacket(rawPacket);
            }
        }