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}失败!"); } }
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); }
public void Dispose() { Logger.Info("Dispose"); foreach (var item in _connections.Values) { Disconnect(item); } _tokenSource.Cancel(); _writer.Close(); _connections.Clear(); UdpKeepAlive.Stop(); _fragmentsTimer.Stop(); }
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("是否已经断开?"); } }
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); }