示例#1
0
        private static void ReadUnsignedVarint(
            Stream stream,
            Bcp.ReadState readState,
            ProcessReadVarint processReadVarint,
            BcpDelegate.ExceptionHandler exceptionHandler)
        {
            var           buffer        = new byte[1];
            var           i             = 0;
            uint          result        = 0U;
            AsyncCallback asyncCallback = null;

            asyncCallback = asyncResult =>
            {
                try
                {
                    int numBytesRead = stream.EndRead(asyncResult);
                    if (numBytesRead != 1)
                    {
                        exceptionHandler(new EndOfStreamException());
                    }
                    uint b = buffer[0];
                    if (i < 32)
                    {
                        if (b >= 0x80)
                        {
                            result |= ((b & 0x7f) << i);
                            i      += 7;
                            stream.BeginRead(buffer, 0, 1, asyncCallback, readState);
                        }
                        else
                        {
                            result |= (b << i);
                            processReadVarint(result);
                        }
                    }
                    else
                    {
                        exceptionHandler(new BcpException.VarintTooBig());
                    }
                }
                catch (Exception e)
                {
                    exceptionHandler(e);
                }
            };
            try
            {
                stream.BeginRead(buffer, 0, 1, asyncCallback, readState);
            }
            catch (Exception e)
            {
                exceptionHandler(e);
            }
        }
示例#2
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);
            }
        }
示例#3
0
        protected void AddIncomingSocket(Stream stream)
        {
            BcpDelegate.ProcessReadHead processReadHead = delegate(Bcp.ConnectionHead connectionHead)
            {
                var    sessionId    = connectionHead.SessionId;
                string sessionKey   = Convert.ToBase64String(sessionId);
                var    connectionId = connectionHead.ConnectionId;
                Debug.WriteLine("BcpServer add incomming socket, sessionId: " + sessionId + ", connectionId: " + connectionId);
                lock (serverLock)
                {
                    BcpServer.Session session;
                    if (sessions.TryGetValue(sessionKey, out session))
                    {
                    }
                    else
                    {
                        session = NewSession(sessionId);
                        sessions.Add(sessionKey, session);
                        session.RaiseAccepted();
                    }
                    if (connectionHead.IsRenew)
                    {
                        session.RenewSession();
                    }
                    session.AddStream(connectionId, stream);
                    Debug.WriteLine("Server added stream!");
                }
            };
            BcpDelegate.ExceptionHandler exceptionHandler = delegate(Exception e)
            {
                Debug.WriteLine("BcpServer add incomming stream exception: " + e.Message);
            };
            TimerCallback readTimeoutCallback = delegate(Object source)
            {
                stream.Dispose();
                exceptionHandler(new Exception());
            };

            Bcp.ReadState readState = new Bcp.ReadState();
            readState.readTimeoutTimer = new Timer(readTimeoutCallback, null, Bcp.ReadingTimeoutMilliseconds, Bcp.ReadingTimeoutMilliseconds);
            BcpIO.ReadHead(stream, readState, processReadHead, exceptionHandler);
        }
示例#4
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);
        }
示例#5
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);
            }
        }
示例#6
0
 protected void AddIncomingSocket(Stream stream)
 {
     BcpDelegate.ProcessReadHead processReadHead = delegate(Bcp.ConnectionHead connectionHead)
     {
         var sessionId = connectionHead.SessionId;
         string sessionKey = Convert.ToBase64String(sessionId);
         var connectionId = connectionHead.ConnectionId;
         Debug.WriteLine("BcpServer add incomming socket, sessionId: " + sessionId + ", connectionId: " + connectionId);
         lock (serverLock)
         {
             BcpServer.Session session;
             if (sessions.TryGetValue(sessionKey, out session))
             {
             }
             else
             {
                 session = NewSession(sessionId);
                 sessions.Add(sessionKey, session);
                 session.RaiseAccepted();
             }
             if (connectionHead.IsRenew)
             {
                 session.RenewSession();
             }
             session.AddStream(connectionId, stream);
             Debug.WriteLine("Server added stream!");
         }
     };
     BcpDelegate.ExceptionHandler exceptionHandler = delegate(Exception e)
     {
         Debug.WriteLine("BcpServer add incomming stream exception: " + e.Message);
     };
     TimerCallback readTimeoutCallback = delegate(Object source)
     {
         stream.Dispose();
         exceptionHandler(new Exception());
     };
     Bcp.ReadState readState = new Bcp.ReadState();
     readState.readTimeoutTimer = new Timer(readTimeoutCallback, null, Bcp.ReadingTimeoutMilliseconds, Bcp.ReadingTimeoutMilliseconds);
     BcpIO.ReadHead(stream, readState, processReadHead, exceptionHandler);
 }