예제 #1
0
파일: Rocket.cs 프로젝트: guibber/WebRocket
        public async Task <RocketResult> SendStreamAsync(MemoryStream stream, CancellationToken token)
        {
            await new PublicSynchronizationContextManager();
            var result = new RocketResult();

            try {
                await mSendLock.WaitAsync(token);

                await Socket.SendAsync(new ArraySegment <byte>(stream.GetBuffer(), (int)stream.Seek(0, SeekOrigin.Begin), (int)stream.Length),
                                       WebSocketMessageType.Binary,
                                       true,
                                       token);

                return(result);
            } catch (WebSocketException ex) {
                return(result.SetException(ex)
                       .SetClosed());
            } finally {
                try {
                    mSendLock.Release();
                } catch (SemaphoreFullException) { }
            }
        }
예제 #2
0
파일: Rocket.cs 프로젝트: guibber/WebRocket
        public async Task <RocketResult> ReceiveStreamAsync(MemoryStream stream, CancellationToken token)
        {
            await new PublicSynchronizationContextManager();
            var result = new RocketResult();

            try {
                await mReceiveLock.WaitAsync(token);

                stream.Seek(0, SeekOrigin.Begin);
                var buffer = new ArraySegment <byte>(new byte[8192]);
                IWebSocketReceiveResult socketResult = null;
                do
                {
                    socketResult = await Socket.ReceiveAsync(buffer, token);

                    if (socketResult.MessageType == WebSocketMessageType.Close)
                    {
                        await Socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "response normal", token);

                        return(result.SetClosed());
                    }

                    stream.Write(buffer.Array, buffer.Offset, socketResult.Count);
                } while (!socketResult.EndOfMessage);

                stream.Seek(0, SeekOrigin.Begin);
                return(result);
            } catch (WebSocketException ex) {
                return(result.SetException(ex)
                       .SetClosed());
            } finally {
                try {
                    mReceiveLock.Release();
                } catch (SemaphoreFullException) { }
            }
        }