Beispiel #1
0
        private void udpServiceMessageReceived(object sender, CitpUdpService.MessageReceivedEventArgs e)
        {
            CitpPacket packet;

            try
            {
                packet = CitpPacket.FromByteArray(e.Data, e.Endpoint);
            }
            catch (InvalidOperationException ex)
            {
                _log.LogError($"Failed to deserialize UDP packet from {e.Endpoint}");
                _log.LogException(ex);
                return;
            }

            if (packet is StreamFrameMessagePacket)
            {
                FrameQueue.Enqueue(Tuple.Create(e.Endpoint.Address, (StreamFrameMessagePacket)packet));
            }
            else if (packet is PeerLocationMessagePacket)
            {
                receivedPeerLocationMessage((PeerLocationMessagePacket)packet, e.Endpoint.Address);
            }
            else
            {
                _log.LogError($"Unrecognised/Invalid packet received via UDP from {e.Endpoint}");
            }
        }
Beispiel #2
0
 public async Task SendMulticastPacketAsync(CitpPacket packet, int requestResponseIndex = 0)
 {
     foreach (var data in packet.ToByteArray(CitpUdpService.MaximumUdpPacketLength, requestResponseIndex))
     {
         await _udpService.SendAsync(data).ConfigureAwait(false);
     }
 }
Beispiel #3
0
        public async Task <bool> SendPacketAsync(CitpPacket packet, CitpPeer peer, [CanBeNull] CitpPacket requestPacket = null)
        {
            if (peer.IsConnected == false)
            {
                throw new InvalidOperationException("Cannot send packet, peer is not connected");
            }

            packet.MessagePart          = 0;
            packet.MessagePartCount     = 1;
            packet.RequestResponseIndex = Convert.ToUInt16(requestPacket?.RequestResponseIndex ?? 0);

            if (packet.LayerType == CitpLayerType.MediaServerExtensionsLayer)
            {
                var msexPacket = (MsexPacket)packet;

                if (peer.MsexVersion.HasValue == false)
                {
                    throw new InvalidOperationException("Peer MSEX version is unknown");
                }

                if (msexPacket.Version.HasValue)
                {
                    if (msexPacket.Version.Value > peer.MsexVersion)
                    {
                        _log.LogWarning("Attempting to send an MSEX message with a higher version number than the peer supports");
                    }
                }
                else
                {
                    ((MsexPacket)packet).Version = peer.MsexVersion;
                }
            }

            return(await sendDataToPeerAsync(peer, packet.ToByteArray(), requestPacket?.RemoteEndpoint?.Port).ConfigureAwait(false));
        }
Beispiel #4
0
        private async void tcpListenService_PacketReceived(object sender, CitpTcpListenService.MessageReceivedEventArgs e)
        {
            _log.LogDebug($"TCP packet ({e.Data.Length} bytes) received from {e.Endpoint}");

            CitpPacket packet;

            try
            {
                packet = CitpPacket.FromByteArray(e.Data, e.Endpoint);
            }
            catch (InvalidOperationException ex)
            {
                _log.LogError($"Error: Failed to deserialize TCP packet from {e.Endpoint}");
                _log.LogException(ex);
                return;
            }
            catch (NotImplementedException ex)
            {
                _log.LogError($"Error: Failed to deserialize TCP packet from {e.Endpoint}, CITP content type not implemented");
                _log.LogException(ex);
                return;
            }

            if (packet is PeerNameMessagePacket)
            {
                receivedPeerNameMessage((PeerNameMessagePacket)packet, e.Endpoint);
                return;
            }

            var peer = _peers.FirstOrDefault(p => p.Ip == e.Endpoint.Address && p.RemoteTcpPorts.Contains(e.Endpoint.Port));

            if (peer == null)
            {
                _log.LogDebug($"Failed to identify peer for received TCP packet, ignoring...");
                return;
            }

            _log.LogDebug($"Packet identified as from CITP Peer '{peer}'");

            if (packet.LayerType == CitpLayerType.MediaServerExtensionsLayer)
            {
                var packetVersion = ((MsexPacket)packet).Version;
                Debug.Assert(packetVersion.HasValue, "Because we should not be able to deserialize a packet without finding the version");

                if (!peer.MsexVersion.HasValue || peer.MsexVersion < packetVersion)
                {
                    peer.MsexVersion = packetVersion;
                }
            }

            if (packet is ClientInformationMessagePacket)
            {
                await receivedClientInformationMessageAsync((ClientInformationMessagePacket)packet, peer).ConfigureAwait(false);
            }
            else
            {
                MessageQueue.Enqueue(Tuple.Create(peer, packet));
            }
        }
Beispiel #5
0
        public void BeginSend(CitpPacket citpMessage)
        {
            MemoryStream     data   = new MemoryStream();
            CitpBinaryWriter writer = new CitpBinaryWriter(data);

            citpMessage.WriteData(writer);
            ((CitpHeader)citpMessage).WriteMessageSize(writer);

            client.Client.BeginSend(data.GetBuffer(), 0, (int)data.Length, SocketFlags.None, new AsyncCallback(OnSendCompleted), null);
        }
Beispiel #6
0
        public async Task SendPacketToAllConnectedPeersAsync(CitpPacket packet)
        {
            var connectedPeers = Peers.Where(p => p.IsConnected).ToList();

            // If it's possible that different peers might need different versions of the packet,
            // run this special routine to avoid serializing the packet more than once for each version.
            if (packet.LayerType == CitpLayerType.MediaServerExtensionsLayer)
            {
                var msexPacket = (MsexPacket)packet;

                if (msexPacket.Version.HasValue == false)
                {
                    msexPacket.MessagePart          = 0;
                    msexPacket.MessagePartCount     = 1;
                    msexPacket.RequestResponseIndex = 0;

                    foreach (MsexVersion version in Enum.GetValues(typeof(MsexVersion)))
                    {
                        if (version == MsexVersion.UnsupportedVersion)
                        {
                            continue;
                        }

                        var peersWithVersion = connectedPeers.Where(p => p.MsexVersion == version).ToList();

                        if (peersWithVersion.Count == 0)
                        {
                            continue;
                        }

                        msexPacket.Version = version;
                        var data = msexPacket.ToByteArray();

                        foreach (var peer in peersWithVersion)
                        {
                            await sendDataToPeerAsync(peer, data).ConfigureAwait(false);
                        }
                    }
                }
            }
            else
            {
                foreach (var peer in connectedPeers)
                {
                    await SendPacketAsync(packet, peer).ConfigureAwait(false);
                }
            }
        }
Beispiel #7
0
 public static void TxPacket(IPEndPoint target, CitpPacket packet)
 {
     trace.TraceEvent(TraceEventType.Verbose, 2, string.Format("{0}: {1}", target.ToString(), packet.ToString()));
     trace.Flush();
 }
Beispiel #8
0
 public static void RxPacket(IPEndPoint source, CitpPacket packet)
 {
     trace.TraceEvent(TraceEventType.Verbose, 1, string.Format("{0}: {1}", source.ToString(), packet.ToString()));
     trace.Flush();
 }
 public CitpNewPacketEventArgs(IPEndPoint localEndPoint, IPEndPoint remoteEndPoint, CitpPacket packet)
 {
     LocalEndPoint  = localEndPoint;
     RemoteEndPoint = remoteEndPoint;
     Packet         = packet;
 }