Ejemplo n.º 1
0
        public async Task <bool> Ping(byte[] opaqueData, CancellationToken cancelToken)
        {
            if (opaqueData == null || opaqueData.Length <= 0)
            {
                throw new ArgumentNullException("opaqueData");
            }

            await connection.Connect();

            var semaphoreWait   = new SemaphoreSlim(0);
            var opaqueDataMatch = false;

            var connectionStream = await streamManager.Get(0);


            Http2Stream.FrameReceivedDelegate frameRxAction;
            frameRxAction = new Http2Stream.FrameReceivedDelegate(frame => {
                var pf = frame as PingFrame;
                if (pf != null)
                {
                    opaqueDataMatch = pf.Ack && pf.OpaqueData != null && pf.OpaqueData.SequenceEqual(opaqueData);
                    semaphoreWait.Release();
                }
            });

            // Wire up the event to listen for ping response
            connectionStream.OnFrameReceived += frameRxAction;

            // Construct ping request
            var pingFrame = new PingFrame();

            pingFrame.OpaqueData = new byte[opaqueData.Length];
            opaqueData.CopyTo(pingFrame.OpaqueData, 0);

            // Send ping
            await connection.QueueFrame(pingFrame);

            // Wait for either a ping response or timeout
            await semaphoreWait.WaitAsync(cancelToken);

            // Cleanup the event
            connectionStream.OnFrameReceived -= frameRxAction;

            return(opaqueDataMatch);
        }
Ejemplo n.º 2
0
        public async Task<bool> Ping (byte[] opaqueData, CancellationToken cancelToken)
        {
            if (opaqueData == null || opaqueData.Length <= 0)
                throw new ArgumentNullException ("opaqueData");
            
            await connection.Connect ();

            var semaphoreWait = new SemaphoreSlim (0);
            var opaqueDataMatch = false;

            var connectionStream = await streamManager.Get (0);


            Http2Stream.FrameReceivedDelegate frameRxAction;
            frameRxAction = new Http2Stream.FrameReceivedDelegate (frame => {
                var pf = frame as PingFrame;
                if (pf != null) {
                    opaqueDataMatch = pf.Ack && pf.OpaqueData != null && pf.OpaqueData.SequenceEqual (opaqueData);
                    semaphoreWait.Release ();
                }
            });

            // Wire up the event to listen for ping response
            connectionStream.OnFrameReceived += frameRxAction;

            // Construct ping request
            var pingFrame = new PingFrame ();
            pingFrame.OpaqueData = new byte[opaqueData.Length];
            opaqueData.CopyTo (pingFrame.OpaqueData, 0);

            // Send ping
            await connection.QueueFrame (pingFrame);

            // Wait for either a ping response or timeout
            await semaphoreWait.WaitAsync (cancelToken);

            // Cleanup the event
            connectionStream.OnFrameReceived -= frameRxAction;

            return opaqueDataMatch;
        }