コード例 #1
0
        private static void ReadAll(
            Stream stream,
            Bcp.ReadState readState,
            byte[] buffer,
            int offset,
            int count,
            ProcessReadAll processReadAll,
            BcpDelegate.ExceptionHandler exceptionHandler)
        {
            AsyncCallback asyncCallback = null;

            asyncCallback = asyncResult =>
            {
                try
                {
                    int numBytesRead = stream.EndRead(asyncResult);
                    if (numBytesRead == 0)
                    {
                        exceptionHandler(new EndOfStreamException());
                    }
                    else
                    {
                        offset += numBytesRead;

                        if (offset < count)
                        {
                            stream.BeginRead(buffer, offset, count, asyncCallback, readState);
                        }
                        else
                        {
                            processReadAll();
                        }
                    }
                }
                catch (Exception e)
                {
                    exceptionHandler(e);
                }
            };
            try
            {
                stream.BeginRead(buffer, offset, count, asyncCallback, readState);
            }
            catch (Exception e)
            {
                exceptionHandler(e);
            }
        }
コード例 #2
0
        public static void ReadHead(Stream stream,
                                    Bcp.ReadState readState,
                                    BcpDelegate.ProcessReadHead processReadHead,
                                    BcpDelegate.ExceptionHandler exceptionHandler)
        {
            var            sessionId      = new byte[Bcp.NumBytesSessionId];
            ProcessReadAll processReadAll = delegate()
            {
                ProcessReadVarint processReadIsRenew = delegate(uint isRenew)
                {
                    ProcessReadVarint processReadConnectionId = delegate(uint connectionId)
                    {
                        readState.Cancel();
                        processReadHead(new Bcp.ConnectionHead(sessionId, Convert.ToBoolean(isRenew), connectionId));
                    };
                    ReadUnsignedVarint(stream, readState, processReadConnectionId, exceptionHandler);
                };
                ReadUnsignedVarint(stream, readState, processReadIsRenew, exceptionHandler);
            };

            ReadAll(stream, readState, sessionId, 0, Bcp.NumBytesSessionId, processReadAll, exceptionHandler);
        }
コード例 #3
0
        public static void Read(Stream stream, Bcp.ReadState readState, BcpDelegate.ProcessRead processRead, BcpDelegate.ExceptionHandler exceptionHandler)
        {
            var           headBuffer    = new byte[1];
            AsyncCallback asyncCallback = null;

            asyncCallback = asyncResult =>
            {
                try
                {
                    int numBytesRead = stream.EndRead(asyncResult);
                    if (numBytesRead != 1)
                    {
                        throw new EndOfStreamException();
                    }
                    switch (headBuffer[0])
                    {
                    case Bcp.Data.HeadByte:
                    {
                        ProcessReadVarint processReadLength = delegate(uint length)
                        {
                            if (length > Bcp.MaxDataSize)
                            {
                                throw new BcpException.DataTooBig();
                            }
                            var            buffer         = new byte[length];
                            ProcessReadAll processReadAll = delegate()
                            {
                                processRead(new Bcp.Data(new[] { (new ArraySegment <byte>(buffer)) }));
                            };
                            ReadAll(stream, readState, buffer, 0, (int)length, processReadAll, exceptionHandler);
                        };
                        ReadUnsignedVarint(stream, readState, processReadLength, exceptionHandler);
                        break;
                    }

                    case Bcp.RetransmissionData.HeadByte:
                    {
                        ProcessReadVarint processReadConnectionId = delegate(uint connectionId)
                        {
                            ProcessReadVarint processReadPackId = delegate(uint packId)
                            {
                                ProcessReadVarint processReadLength = delegate(uint length)
                                {
                                    if (length > Bcp.MaxDataSize)
                                    {
                                        throw new BcpException.DataTooBig();
                                    }
                                    var            buffer         = new byte[length];
                                    ProcessReadAll processReadAll = delegate()
                                    {
                                        processRead(new Bcp.RetransmissionData(connectionId, packId, new[] { (new ArraySegment <byte>(buffer)) }));
                                    };
                                    ReadAll(stream, readState, buffer, 0, (int)length, processReadAll, exceptionHandler);
                                };
                                ReadUnsignedVarint(stream, readState, processReadLength, exceptionHandler);
                            };
                            ReadUnsignedVarint(stream, readState, processReadPackId, exceptionHandler);
                        };
                        ReadUnsignedVarint(stream, readState, processReadConnectionId, exceptionHandler);
                        break;
                    }

                    case Bcp.RetransmissionFinish.HeadByte:
                    {
                        ProcessReadVarint processReadConnectionId = delegate(uint connectionId)
                        {
                            ProcessReadVarint processReadPackId = delegate(uint packId)
                            {
                                processRead(new Bcp.RetransmissionFinish(connectionId, packId));
                            };
                            ReadUnsignedVarint(stream, readState, processReadPackId, exceptionHandler);
                        };
                        ReadUnsignedVarint(stream, readState, processReadConnectionId, exceptionHandler);
                        break;
                    }

                    case Bcp.Acknowledge.HeadByte:
                        processRead(new Bcp.Acknowledge());
                        break;

                    case Bcp.Finish.HeadByte:
                        processRead(new Bcp.Finish());
                        break;

                    case Bcp.ShutDown.HeadByte:
                        processRead(new Bcp.ShutDown());
                        break;

                    case Bcp.HeartBeat.HeadByte:
                        processRead(new Bcp.HeartBeat());
                        break;

                    default:
                        throw new BcpException.UnknownHeadByte();
                    }
                }
                catch (Exception e)
                {
                    exceptionHandler(e);
                }
            };
            try
            {
                stream.BeginRead(headBuffer, 0, 1, asyncCallback, readState);
            }
            catch (Exception e)
            {
                exceptionHandler(e);
            }
        }
コード例 #4
0
ファイル: BcpIO.cs プロジェクト: qifun/CSharpBcp
        private static void ReadAll(
            Stream stream,
            Bcp.ReadState readState,
            byte[] buffer,
            int offset,
            int count,
            ProcessReadAll processReadAll,
            BcpDelegate.ExceptionHandler exceptionHandler)
        {
            AsyncCallback asyncCallback = null;
            asyncCallback = asyncResult =>
            {
                try
                {
                    int numBytesRead = stream.EndRead(asyncResult);
                    if (numBytesRead == 0)
                    {
                        exceptionHandler(new EndOfStreamException());
                    }
                    else
                    {
                        offset += numBytesRead;

                        if (offset < count)
                        {
                            stream.BeginRead(buffer, offset, count, asyncCallback, readState);
                        }
                        else
                        {
                            processReadAll();
                        }
                    }
                }
                catch (Exception e)
                {
                    exceptionHandler(e);
                }
            };
            try
            {
                stream.BeginRead(buffer, offset, count, asyncCallback, readState);
            }
            catch (Exception e)
            {
                exceptionHandler(e);
            }
        }