Esempio n. 1
0
        public NetUnit(int bufferSize = 1024, int port = 11000)
        {
            try
            {
                allDone         = new ManualResetEvent(false);
                this.bufferSize = bufferSize;

                IPHostEntry ipHostInfo    = Dns.GetHostEntry(Dns.GetHostName());
                IPAddress   ipAddress     = ipHostInfo.AddressList[0];
                IPEndPoint  localEndPoint = new IPEndPoint(ipAddress, port);

                mySocket = new Socket(ipAddress.AddressFamily,
                                      SocketType.Stream, ProtocolType.Tcp);

                mySocket.Bind(localEndPoint);
                mySocket.Listen(200);

                connectionManager = new ConnectionManager();

                logger.Info("Server started!");

                new Thread(Listen).Start();
            }
            catch (Exception exception)
            {
                logger.Error(exception);
            }
        }
Esempio n. 2
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);
         }
     }
 }
Esempio n. 3
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);
     }
 }
Esempio n. 4
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);
     }
 }
Esempio n. 5
0
        private void _CheckConnectionState()
        {
            // This is how you can determine whether a socket is still connected. 
            var blockingState = _client.Client.Blocking;

            try {
                _client.Client.Blocking = false;
                Send(new _TcpCheckPacket());
                if (showLog)
                {
                    ULogger.Info($"<{serviceName}> Send _TcpCheckPacket.");
                }
            } catch (SocketException e) {
                Debug.Log(e);
                // 10035 == WSAEWOULDBLOCK 
                if (!e.NativeErrorCode.Equals(10035))
                {
                    _HandleConnectionClosedByRemote();
                }
            } finally {
                if (_client != null)
                {
                    _client.Client.Blocking = blockingState;
                }
            }
        }
Esempio n. 6
0
 public void Resume()
 {
     if (CurrentState != ServiceState.Paused)
     {
         return;
     }
     enabled = true;
     ULogger.Info($"Service {serviceName} resumed");
     Resumed.Trigger();
 }
Esempio n. 7
0
 public void Pause()
 {
     if (CurrentState != ServiceState.Running)
     {
         return;
     }
     enabled = false;
     ULogger.Info($"Service {serviceName} paused");
     Paused.Trigger();
 }
Esempio n. 8
0
        private void _AcceptConnectionToClient()
        {
            _client = _listener.AcceptTcpClient();
            _listener.Stop();
            _lastCheckTime = Time.realtimeSinceStartup;
            var clientEP = (IPEndPoint)_client.Client.RemoteEndPoint;

            ULogger.Info(
                $"<{serviceName}> Client has been connected: {clientEP.Address}:{clientEP.Port}.");
        }
        public void Start(int bufferSize, int port = 11000)
        {
            try
            {
                _logger     = new ULogger();
                _bufferSize = bufferSize;
                _allDone    = new ManualResetEvent(false);


                IPHostEntry ipHostInfo    = Dns.GetHostEntry(Dns.GetHostName());
                IPAddress   ipAddress     = ipHostInfo.AddressList[0];
                IPEndPoint  localEndPoint = new IPEndPoint(ipAddress, port);

                Socket listener = new Socket(ipAddress.AddressFamily,
                                             SocketType.Stream, ProtocolType.Tcp);

                listener.Bind(localEndPoint);
                listener.Listen(200);

                _serverIsRunning = true;
                _logger.Info("Server started!");

                while (true)
                {
                    _allDone.Reset();

                    _logger.Info("Waiting for connection...");

                    listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);

                    _allDone.WaitOne();
                }
            }
            catch (Exception exception)
            {
                _logger.Error(exception);
                throw exception;
            }
        }
Esempio n. 10
0
 private void _HandleConnectionClosedByRemote(_TcpClosePacket packet = null)
 {
     ULogger.Info(packet != null ?
                  $"<{serviceName}> Connection closed by remote." :
                  $"<{serviceName}> Connection to remote is lost.");
     _client.Dispose();
     _client = null;
     Shutdown();
     if (retryInterval > 0)
     {
         Startup();
     }
 }
Esempio n. 11
0
 private void _CloseConnectionToClient(_TcpClosePacket packet = null)
 {
     if (packet != null)
     {
         ULogger.Info($"<{serviceName}> Close connection to client.");
         Send(new _TcpClosePacket());
     }
     else
     {
         ULogger.Info($"<{serviceName}> Connection to client is closed.");
     }
     _client.Dispose();
     _client = null;
     _listener.Start();
     Disconnected.Trigger();
 }
Esempio n. 12
0
 public void Shutdown()
 {
     if (CurrentState == ServiceState.Stopped)
     {
         return;
     }
     try {
         _Shutdown();
     } catch (Exception) {
         // ignored
     }
     RuntimeErrorMessage = null;
     _started            = false;
     enabled             = false;
     ULogger.Info($"Service {serviceName} stopped");
     Stopped.Trigger();
 }
Esempio n. 13
0
        protected override void _Update()
        {
            if (_client == null)
            {
                if (_listener.Pending())
                {
                    _AcceptConnectionToClient();
                }
                return;
            }

            if (Time.realtimeSinceStartup - _lastCheckTime > CONN_CHECK_INTERVAL * 5)
            {
                ULogger.Info($"<{serviceName}> Connection is timeout.");
                _CloseConnectionToClient();
                return;
            }
            _Receive();
        }
Esempio n. 14
0
        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);
            }
        }
Esempio n. 15
0
 public void EditorInfo(object message)
 {
     innerLogger.Info(message);
 }