예제 #1
0
        public async ValueTask <int> ReadAsync(Memory <byte> message, CancellationToken cancellationToken)
        {
            if (!MemoryMarshal.TryGetArray <byte>(message, out var segment))
            {
                Sally7Exception.ThrowMemoryWasNotArrayBased();
            }

            args.SetBuffer(segment.Array, segment.Offset, TpktSize);

            int count = 0;

            do
            {
                if (count > 0)
                {
                    args.SetBuffer(segment.Offset + count, TpktSize - count);
                }

                cancellationToken.ThrowIfCancellationRequested();
                await socket.ReceiveAsync(awaitable);

                if (args.BytesTransferred <= 0)
                {
                    TpktException.ThrowConnectionWasClosedWhileReading();
                }

                count += args.BytesTransferred;
            } while (count < TpktSize);

            int receivedLength = GetTpktLength(message.Span);

            while (count < receivedLength)
            {
                cancellationToken.ThrowIfCancellationRequested();
                args.SetBuffer(segment.Offset + count, receivedLength - count);
                await socket.ReceiveAsync(awaitable);

                if (args.BytesTransferred <= 0)
                {
                    TpktException.ThrowConnectionWasClosedWhileReading();
                }

                count += args.BytesTransferred;
            }

            return(receivedLength);
        }
예제 #2
0
파일: Tpkt.cs 프로젝트: mycroes/Sally7
        public readonly void Assert()
        {
            if (Version != IsoVersion)
            {
                TpktException.ThrowIncorrectHeaderVersion();
            }

            if (Reserved != 0)
            {
                TpktException.ThrowReseveredNot0();
            }

            if (Length.High == 0 && Length.Low < 7)
            {
                TpktException.ThrowLengthSmallerThan7();
            }
        }