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); } } }
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); } }
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); } }
/// <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); }
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}"); } }
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); } }