Esempio n. 1
0
        private void AcknowledgeConnect(IPEndPoint endPoint, IReadStream readStream,
                                        PacketHead packetHead)
        {
            if (_connections.ContainsKey(endPoint))
            {
                Logger.Warn($"{endPoint}已经连接,无需重复连接!");
                return;
            }

            var service = new SocketService();

            service.Connection.RemoteAddress = endPoint;
            service.Connection.LocalAddress  = _writer.Client.LocalEndPoint as IPEndPoint;

            if (_connections.TryAdd(endPoint, service))
            {
                _autoResetEvent.Set();
                UdpKeepAlive.AddConnection(service,
                                           () => HandleReconnect?.Invoke(service, true),
                                           () => {
                    HandleReconnect?.Invoke(service, false);
                    OnDisconnect(service);
                });

                HandleConnect?.Invoke(service, readStream);

                Logger.Info($"{endPoint}连接成功!");
            }
            else
            {
                Logger.Error($"添加连接{endPoint}失败!");
            }
        }
Esempio n. 2
0
        public UdpSocket(int nextHeadOffset, NetworkConfig networkConfig)
        {
            _networkConfig  = networkConfig ?? throw new ArgumentNullException(nameof(networkConfig));
            _tokenSource    = new CancellationTokenSource();
            _autoResetEvent = new AutoResetEvent(false);
            _connections    = new ConcurrentDictionary <EndPoint, SocketService>();
            _fragmentsTimer = new FragmentsTimer();

            _nextHeadOffset = nextHeadOffset;

            PoolAllocator <IWriteStream> .SetPool(args =>
                                                  ObjectFactory.GetActivator <IWriteStream>(typeof(WriteStream).GetConstructors().First())());

            PoolAllocator <IReadStream> .SetPool(args =>
                                                 ObjectFactory.GetActivator <IReadStream>(typeof(ReadStream).GetConstructors().First())());

            if (_networkConfig.KeepAlive)
            {
                UdpKeepAlive.Start(_networkConfig.AckInterval, _networkConfig.MaxReconnectCount);
            }

            if (_networkConfig.FragmentResend)
            {
                _fragmentsTimer.Start(_networkConfig.ResendInterval);
            }

            var ipAddress = new IPEndPoint(IPAddress.Parse(_networkConfig.ServerIp), _networkConfig.ServerPort);

            _writer = new UdpClient(ipAddress.AddressFamily)
            {
                Client = CreateSocket(ipAddress.AddressFamily, null)
            };

            Task.Factory.StartNew(ReceiveAsync, _networkConfig, _tokenSource.Token);
        }
Esempio n. 3
0
        public void Dispose()
        {
            Logger.Info("Dispose");

            foreach (var item in _connections.Values)
            {
                Disconnect(item);
            }

            _tokenSource.Cancel();
            _writer.Close();
            _connections.Clear();

            UdpKeepAlive.Stop();
            _fragmentsTimer.Stop();
        }
Esempio n. 4
0
 private void OnDisconnect(SocketService socketService)
 {
     if (_connections.TryRemove(socketService.Connection.RemoteAddress,
                                out socketService))
     {
         UdpKeepAlive.Remove(socketService);
         foreach (var id in socketService.PacketIds)
         {
             _fragmentsTimer.Remove(id);
         }
         socketService.OnDisconnect();
         Logger.Info($"断开{socketService.Connection.RemoteAddress}连接!");
     }
     else
     {
         Logger.Warn("是否已经断开?");
     }
 }
Esempio n. 5
0
        private void ResponseAck(IPEndPoint endPoint, IReadStream readStream,
                                 PacketHead packetHead)
        {
            if (!_connections.TryGetValue(endPoint, out var socketService))
            {
                Logger.Error($"{endPoint}连接没有添加!");
                return;
            }

            Logger.Info($"接收到{endPoint}心跳包!");

            Acknowledge(socketService, SendOption.Acknowledge | SendOption.Ack, packetHead);

            if (socketService.ReconnectCount > 0)
            {
                Logger.Debug("关闭重连:" + socketService.ReconnectCount);
                HandleReconnect?.Invoke(socketService, false);
            }

            UdpKeepAlive.Reset(socketService);
        }