private void TurnServer_PeerDataReceived(ref ServerAsyncEventArgs e) { //lock (syncRoot) { try { Allocation allocation = allocations.GetByPeer(e.LocalEndPoint, e.RemoteEndPoint); if (allocation != null) { allocation.TouchLifetime(); if (allocation.IsActiveDestinationEnabled) { e.LocalEndPoint = allocation.Alocated; e.RemoteEndPoint = allocation.ActiveDestination; e.Count = e.BytesTransferred; e.ConnectionId = ServerAsyncEventArgs.AnyNewConnectionId; peerServer.SendAsync(e); e = null; } } } catch (Exception ex) { logger.WriteWarning(ex.ToString()); } } }
private void TurnServer_TurnDataReceived(ref ServerAsyncEventArgs e) { //lock (syncRoot) { TurnMessage response = null; try { if (true)//(TransactionServer.GetCachedResponse(e, out response) == false) { TurnMessage request = TurnMessage.Parse(e.Buffer, e.Offset, e.BytesTransferred, TurnMessageRfc.MsTurn); if (Authentificater.Process(request, out response)) { Allocation allocation = null; if (request.MsSequenceNumber != null) { allocation = allocations.Get(request.MsSequenceNumber.ConnectionId); } if (allocation != null) { if (request.MsSequenceNumber != null) { response = allocation.GetResponse(request.MsSequenceNumber.SequenceNumber); } } if (response == null) { if (allocation != null) { allocation.TouchLifetime(); } switch (request.MessageType) { case MessageType.AllocateRequest: response = ProcessAllocateRequest(ref allocation, request, e.LocalEndPoint, e.RemoteEndPoint); break; case MessageType.SendRequest: response = ProcessSendRequest(allocation, request, ref e); break; case MessageType.SetActiveDestinationRequest: response = ProcessSetActiveDestinationRequest(allocation, request, e.RemoteEndPoint); break; } if (allocation != null && response != null) { allocation.SetResponse(response); } } } //TransactionServer.CacheResponse(e, response); } } catch (TurnMessageException ex) { response = GetErrorResponse(ex.ErrorCode, e); } catch (TurnServerException ex) { response = GetErrorResponse(ex.ErrorCode, e); } catch (Exception ex) { response = GetErrorResponse(ErrorCode.ServerError, e); logger.WriteError(ex.ToString()); } if (response != null) { SendTurn(response, e.LocalEndPoint, e.RemoteEndPoint); } } }
private bool PeerServer_Received(ServersManager <PeerConnection> s, BaseConnection с, ref ServerAsyncEventArgs e) { //lock (syncRoot) { try { Allocation allocation = allocations.Get(e.LocalEndPoint); if (allocation != null) { if (allocation.Permissions.IsPermited(e.RemoteEndPoint)) { allocation.TouchLifetime(); if (allocation.ActiveDestination.IsEqual(e.RemoteEndPoint)) { if (e.LocalEndPoint.Protocol == ServerProtocol.Tcp) { TcpFramingHeader.GetBytes(e.Buffer, e.Offset, TcpFrameType.EndToEndData, e.BytesTransferred); e.Count = e.OffsetOffset + e.BytesTransferred; e.OffsetOffset = 0; } else { e.Count = e.BytesTransferred; } e.LocalEndPoint = allocation.Local; e.RemoteEndPoint = allocation.Reflexive; e.ConnectionId = ServerAsyncEventArgs.AnyConnectionId; turnServer.SendAsync(e); e = null; } else { TurnMessage message = new TurnMessage() { IsAttributePaddingDisabled = true, MessageType = MessageType.DataIndication, TransactionId = TransactionServer.GenerateTransactionId(), MagicCookie = new MagicCookie(), RemoteAddress = new RemoteAddress() { IpAddress = e.RemoteEndPoint.Address, Port = (UInt16)e.RemoteEndPoint.Port, }, Data = new Data() { ValueRef = e.Buffer, ValueRefOffset = e.Offset, ValueRefLength = e.BytesTransferred, }, }; SendTurn(message, allocation.Local, allocation.Reflexive); } } } } catch (Exception ex) { logger.WriteWarning(ex.ToString()); } } return(true); }