コード例 #1
0
        private void CloseCallback(object closingStateObject)
        {
            var closingState = (ClosingState)closingStateObject;

            // Stop reading process (if any)
            try
            {
                this.BaseSocket.ReadStop();
            }
            catch (Exception exception)
            {
                closingState.RegisterException(exception);
            }

            // Clear receive state and free the receive buffer
            var state = this.receiveState;

            this.receiveState = null;

            // Return acquired buffer to the pool
            state?.Buffer?.Dispose();

            // Shut down any writing operations
            // Handle will be closed after the shutdown process
            var shutdownRequest = new UvShutdownRequest(this.BaseSocket, this.ShutdownCallback, closingState);

            try
            {
                shutdownRequest.Shutdown();
            }
            catch (Exception exception)
            {
                this.ShutdownCallback(shutdownRequest, exception, closingState);
            }
        }
コード例 #2
0
        public StreamEngine(AsyncSocket handle, Options options, string endpoint)
        {
            m_handle         = handle;
            m_insize         = 0;
            m_ioEnabled      = false;
            m_sendingState   = SendState.Idle;
            m_receivingState = ReceiveState.Idle;
            m_outsize        = 0;
            m_session        = null;
            m_options        = options;
            m_plugged        = false;
            m_endpoint       = endpoint;
            m_socket         = null;
            m_encoder        = null;
            m_decoder        = null;
            m_actionsQueue   = new Queue <StateMachineAction>();

            // Set the socket buffer limits for the underlying socket.
            if (m_options.SendBuffer != 0)
            {
                m_handle.SendBufferSize = m_options.SendBuffer;
            }
            if (m_options.ReceiveBuffer != 0)
            {
                m_handle.ReceiveBufferSize = m_options.ReceiveBuffer;
            }
        }
コード例 #3
0
 /// <summary>
 /// Disconnect network
 /// </summary>
 public virtual void OnDisConnected()
 {
     KDCommon.Log("SessionID:" + sessionID + " Client Offline" + ",在线人数:" + CacheSvc.Instance.GetOnlineServerSessions().Count);
     LoginSys.Instance.ClearOfflineData(this);
     SendState.Dispose();
     ReceiveState.Dispose();
 }
コード例 #4
0
ファイル: Connection.cs プロジェクト: RobotCaleb/OpenRA
        public void ReadData(Server server)
        {
            if (ReadDataInner(server))
                while (data.Count >= ExpectLength)
                {
                    var bytes = PopBytes(ExpectLength);
                    switch (State)
                    {
                        case ReceiveState.Header:
                            {
                                ExpectLength = BitConverter.ToInt32(bytes, 0) - 4;
                                Frame = BitConverter.ToInt32(bytes, 4);
                                State = ReceiveState.Data;

                                if (ExpectLength < 0 || ExpectLength > MaxOrderLength)
                                {
                                    server.DropClient(this);
                                    Log.Write("server", "Dropping client {0} for excessive order length = {1}", PlayerIndex, ExpectLength);
                                    return;
                                }
                            } break;

                        case ReceiveState.Data:
                            {
                                server.DispatchOrders(this, Frame, bytes);
                                MostRecentFrame = Frame;
                                ExpectLength = 8;
                                State = ReceiveState.Header;

                            } break;
                    }
                }
        }
コード例 #5
0
        void OnAccept(IAsyncResult asyncResult)
        {
            Socket clientSocket = null;

            try
            {
                clientSocket = listenSocket.EndAccept(asyncResult);

                // Wait for next client
                this.listenSocket.BeginAccept(OnAccept, null);

                IPEndPoint clientIp = (IPEndPoint)clientSocket.RemoteEndPoint;
                Console.WriteLine("Connection from {0}.{1}", clientIp.Address, clientIp.Port);
                ReceiveState receiveState = new ReceiveState
                {
                    ClientSocket    = clientSocket,
                    Buffer          = new byte[4],
                    Offset          = 0,
                    Count           = 4,
                    ReceivingLength = true,
                };
                clientSocket.BeginReceive(receiveState.Buffer, 0, 4, SocketFlags.None, OnReceive, receiveState);
            }
            catch (ObjectDisposedException)
            {
                // socket closed
            }
            catch (SocketException e)
            {
                Console.WriteLine("Socket exception: {0}", e);
            }
        }
コード例 #6
0
    private void ReceiveAsync(ClientSocket clientSocket)
    {
        Socket socket = clientSocket.Socket;

        if (!socket.Connected)
        {
            return;
        }
        ReceiveState readBuff = clientSocket.ReceiveState;

        try {
            int count = socket.Receive(readBuff.Stream.GetBuffer(), (int)readBuff.Stream.Position,
                                       (int)(readBuff.Stream.Length - readBuff.Stream.Position), SocketFlags.None);
            readBuff.Stream.Position += count;
            if (count <= 0)
            {
                CloseClient(clientSocket);
                return;
            }
            OnReceiveData(clientSocket);
        }
        catch (Exception exception) {
            Debug.LogError("客户端连接问题:" + exception);
            CloseClient(clientSocket);
            //throw;
        }
    }
コード例 #7
0
    //解析我们的信息
    void OnReceiveData(ClientSocket clientSocket)
    {
        ReceiveState readbuff = clientSocket.ReceiveState;

        if (readbuff.Stream.Position < readbuff.Stream.Length)  //未接收满包头或包体
        {
            return;
        }
        readbuff.Stream.Position = 0L;

        bool processSuccess = false;

        if (readbuff.PacketHeader != null)
        {
            processSuccess = ProcessPacket(clientSocket);
        }
        else
        {
            processSuccess = ProcessPacketHeader(clientSocket);
        }

        if (processSuccess)
        {
            //ReceiveAsync(clientSocket);
            return;
        }
    }
コード例 #8
0
        public static JamPacket Receive(SslStream stream)
        {
            const int RECEIVE_TIMEOUT = 2000;

            ReceiveState state = new ReceiveState()
            {
                Stream           = stream,
                Packet           = new JamPacket(),
                HeaderBuffer     = new byte[Marshal.SizeOf(typeof(JamPacketHeader))],
                ReceiveCompleted = new AutoResetEvent(false)
            };

            try
            {
                stream.BeginRead(state.HeaderBuffer, 0, state.HeaderBuffer.Length, ReceiveHeaderCallback, state);
                if (Debugger.IsAttached)
                {
                    state.ReceiveCompleted.WaitOne();
                }
                else
                {
                    state.ReceiveCompleted.WaitOne(RECEIVE_TIMEOUT);
                }
            }
            catch (IOException) { }

            if (state.Packet.Header.DataType == 0)
            {
                return(null);
            }

            state.Packet.ContainsData = true;
            return(state.Packet);
        }
コード例 #9
0
ファイル: UdpSocket.cs プロジェクト: danchart/Ecs
        private static void ReceiveAsync(IAsyncResult ar)
        {
            ReceiveState state         = (ReceiveState)ar.AsyncState;
            int          bytesReceived = state.Socket.EndReceiveFrom(ar, ref state.EndPointFrom);

            state.ReceiveBuffer.EndWrite(bytesReceived, (IPEndPoint)state.EndPointFrom);

            byte[] data;
            int    offset, size;
            bool   isWriteBufferWait = false;

            while (!state.ReceiveBuffer.BeginWrite(out data, out offset, out size))
            {
                if (!isWriteBufferWait)
                {
                    isWriteBufferWait = true;

                    state.Logger.Error("UDP server socket is out of writable buffer space.");
                }
                // Wait for write queue to become available.
                Thread.Sleep(6);
            }

            // Chain next receive.
            state.Socket.BeginReceiveFrom(
                data,
                offset,
                size,
                SocketFlags.None,
                ref state.EndPointFrom,
                ReceiveAsyncCallback,
                state);
        }
コード例 #10
0
        /// <summary>
        /// A callback the gets invoked after SSL auth completes.
        /// </summary>
        /// <param name="result"></param>
        private void EnableServerSslCallback(IAsyncResult result)
        {
            canRead = true;

            SslStream sslStream = (SslStream)result.AsyncState;

            sslStream.EndAuthenticateAsServer(result);

            SockNetLogger.Log(SockNetLogger.LogLevel.INFO, this, "Authenticated SSL with [{0}].", RemoteEndpoint);
            SockNetLogger.Log(SockNetLogger.LogLevel.DEBUG, this, "[SSL] Reading data from [{0}]...", RemoteEndpoint);

            this.stream = sslStream;

            PooledObject <byte[]> buffer = bufferPool.Borrow();

            buffer.RefCount.Increment();

            receiveState = new ReceiveState()
            {
                buffer = buffer, offset = 0, length = buffer.Value.Length
            };

            currentReadResult = stream.BeginRead(buffer.Value, 0, buffer.Value.Length, new AsyncCallback(ReceiveCallback), null);

            attachPromiseFulfiller.Fulfill(this);
        }
コード例 #11
0
            /// <summary>
            /// 关闭连接并释放所有相关资源。
            /// </summary>
            public void Close()
            {
                if (m_Socket == null)
                {
                    return;
                }

                m_Active = false;
                try
                {
                    m_Socket.Shutdown(SocketShutdown.Both);
                }
                catch
                {
                }
                finally
                {
                    m_Socket.Close();
                    m_Socket       = null;
                    m_ReceiveState = null;

                    if (NetworkChannelClosed != null)
                    {
                        NetworkChannelClosed(this);
                    }
                }
            }
コード例 #12
0
ファイル: Connection.cs プロジェクト: comradpara/OpenRA
        public void ReadData()
        {
            if (ReadDataInner())
                while (data.Count >= ExpectLength)
                {
                    var bytes = PopBytes(ExpectLength);
                    switch (State)
                    {
                        case ReceiveState.Header:
                            {
                                ExpectLength = BitConverter.ToInt32(bytes, 0) - 4;
                                Frame = BitConverter.ToInt32(bytes, 4);
                                State = ReceiveState.Data;
                            } break;

                        case ReceiveState.Data:
                            {
                                Server.DispatchOrders(this, Frame, bytes);
                                MostRecentFrame = Frame;
                                ExpectLength = 8;
                                State = ReceiveState.Header;

                                Server.UpdateInFlightFrames(this);
                            } break;
                    }
                }
        }
コード例 #13
0
        public void BeginHandling()
        {
            Console.WriteLine("{0} connected.", skt.RemoteEndPoint);

            skt.NoDelay             = true;
            skt.UseOnlyOverlappedIO = true;

            send            = new SocketAsyncEventArgs();
            send.Completed += IOCompleted;
            send.UserToken  = new SendToken();
            send.SetBuffer(new byte[BUFFER_SIZE], 0, BUFFER_SIZE);

            var receive = new SocketAsyncEventArgs();

            receive.Completed += IOCompleted;
            receive.UserToken  = new ReceiveToken();
            receive.SetBuffer(new byte[BUFFER_SIZE], 0, BUFFER_SIZE);

            receiveState = ReceiveState.ReceivingHdr;
            receive.SetBuffer(0, 5);
            if (!skt.ReceiveAsync(receive))
            {
                IOCompleted(this, receive);
            }
        }
コード例 #14
0
ファイル: Connection.cs プロジェクト: test71/OpenRA
        public void ReadData(Server server)
        {
            if (ReadDataInner(server))
            {
                while (data.Count >= ExpectLength)
                {
                    var bytes = PopBytes(ExpectLength);
                    switch (State)
                    {
                    case ReceiveState.Header:
                    {
                        ExpectLength = BitConverter.ToInt32(bytes, 0) - 4;
                        Frame        = BitConverter.ToInt32(bytes, 4);
                        State        = ReceiveState.Data;
                    } break;

                    case ReceiveState.Data:
                    {
                        server.DispatchOrders(this, Frame, bytes);
                        MostRecentFrame = Frame;
                        ExpectLength    = 8;
                        State           = ReceiveState.Header;

                        server.UpdateInFlightFrames(this);
                    } break;
                    }
                }
            }
        }
コード例 #15
0
        protected void Close(Exception exception)
        {
            if (!this.TryClose())
            {
                return;
            }

            ReceiveState state;

            lock (this.SyncRoot)
            {
                state             = this.receiveState;
                this.receiveState = null;
            }

            if (this.BaseSocket.Connected)
            {
                this.BaseSocket.Shutdown(SocketShutdown.Both);
                this.BaseSocket.Dispose();
            }

            // Return acquired buffer to the pool
            state?.Buffer.Dispose();

            this.InvokeClosedEvent(exception);
        }
コード例 #16
0
        public static void Receive(TcpSocket socket, StreamSocket client, ReceiveState receiveState, Action <byte[], int> onReceived)
        {
            client.InputStream.ReadAsync(receiveState.buffer.AsBuffer(0, 4), 4u, InputStreamOptions.Partial).Completed =
                (IAsyncOperationWithProgress <IBuffer, uint> numBytesOp, AsyncStatus numBytesStatus) =>
            {
                var numBytes = BitConverter.ToInt32(numBytesOp.GetResults().ToArray(), 0);
#if HOLOLENSSOCKET_DEBUG
                Debug.Log("Expecting " + numBytes.ToString() + " bytes.");
#endif
                while (receiveState.buffer.Length < numBytes)
                {
                    socket.ResizeReceiveBuffer(2);
                }

                client.InputStream.ReadAsync(receiveState.buffer.AsBuffer(0, numBytes), (uint)numBytes, InputStreamOptions.Partial).Completed =
                    (IAsyncOperationWithProgress <IBuffer, uint> bytesOp, AsyncStatus bytesStatus) =>
                {
                    if (onReceived != null)
                    {
#if HOLOLENSSOCKET_DEBUG
                        Debug.Log("Received " + bytesOp.GetResults().Length + " bytes.");
#endif
                        onReceived(receiveState.buffer, receiveState.buffer.Length);
                    }
                };
            };
        }
コード例 #17
0
        public void BeginHandling()
        {
            //TODO: Add account id here instead of in clientprocessor
            Console.WriteLine("{0} connected.", skt.RemoteEndPoint);
            //This logging code below is a HUUUUUUUUUGE godsend to anyone hosting on hamachi because anyone playing through hamachi gets a static IP that CANNOT be changed with a proxy or VPN, this makes it one million times easier to track cheating/hacking players on your server. If you're hosting on a VPS however, it's an entirely different story and may as well disable this.
            var dir = @"logs";             //start of logging code

            if (!System.IO.Directory.Exists(dir))
            {
                System.IO.Directory.CreateDirectory(dir);
            }
            //If someone added being able to log usernames in this log and maybe even extra computer information that would be amazing.
            using (System.IO.StreamWriter writer = new System.IO.StreamWriter(@"logs\LogOnLog.txt", true))             //HUGE problem I see, if multiple clients connect at once, one or more of the clients won't have their IP logged. Could probably result in ServerEngine crash. NOTE: Just double checked this, multiple clients connecting at once brings up NO problems, but if you're debugging with intellitrace, you will get a popup saying that multiple access's to the file "LogOnLog.txt" was established. Just ignore it and move on. This logging doesn't cause memory problems as far as I can tell.
            {
                writer.WriteLine("[" + DateTime.Now + "]" + skt.RemoteEndPoint + " has connected.");
            }                                             //end of logging code
            skt.NoDelay             = true;               //don't delay sending thru sockets
            skt.UseOnlyOverlappedIO = true;
            send            = new SocketAsyncEventArgs(); //Hmm...
            send.Completed += IOCompleted;
            send.UserToken  = new SendToken();
            send.SetBuffer(new byte[BUFFER_SIZE], 0, BUFFER_SIZE);
            var receive = new SocketAsyncEventArgs();

            receive.Completed += IOCompleted;
            receive.UserToken  = new ReceiveToken();
            receive.SetBuffer(new byte[BUFFER_SIZE], 0, BUFFER_SIZE);
            receiveState = ReceiveState.ReceivingHdr;
            receive.SetBuffer(0, 5);
            if (!skt.ReceiveAsync(receive))             //if the packet is received...
            {
                IOCompleted(this, receive);             //... complete the handle
            }
        }
コード例 #18
0
            /// <summary>
            /// 初始化网络频道基类的新实例。
            /// </summary>
            /// <param name="name">网络频道名称。</param>
            /// <param name="networkChannelHelper">网络频道辅助器。</param>
            public NetworkChannelBase(string name, INetworkChannelHelper networkChannelHelper)
            {
                m_Name                 = name ?? string.Empty;
                m_SendPacketPool       = new Queue <Packet>();
                m_ReceivePacketPool    = new EventPool <Packet>(EventPoolMode.Default);
                m_NetworkChannelHelper = networkChannelHelper;
                m_AddressFamily        = AddressFamily.Unknown;
                m_ResetHeartBeatElapseSecondsWhenReceivePacket = false;
                m_HeartBeatInterval   = DefaultHeartBeatInterval;
                m_Socket              = null;
                m_SendState           = new SendState();
                m_ReceiveState        = new ReceiveState();
                m_HeartBeatState      = new HeartBeatState();
                m_SentPacketCount     = 0;
                m_ReceivedPacketCount = 0;
                m_Active              = false;
                m_Disposed            = false;

                NetworkChannelConnected     = null;
                NetworkChannelClosed        = null;
                NetworkChannelMissHeartBeat = null;
                NetworkChannelError         = null;
                NetworkChannelCustomError   = null;

                networkChannelHelper.Initialize(this);
            }
コード例 #19
0
ファイル: WebSocket.cs プロジェクト: RonaldV/hyperion
        private void OnReceiveAsync(IAsyncResult asyncResult)
        {
            var state = (ReceiveState)asyncResult.AsyncState;
            //var size = state.Socket.SafeEndReceive(asyncResult);
            var size = stream.EndRead(asyncResult, Error.Raise);

            if (size < 1)
            {
                // No data was received
                Dispose();
            }

            var frame = state.Frame;

            frame.Add(state.Buffer);
            if (frame.IsClosed)
            {
                Received.Raise(frame.ToContentString());
                // Begin receiving data for a new frame
                ReceiveAsync();
            }
            else
            {
                // Receive more data for the current frame
                var nextState = new ReceiveState
                {
                    //Socket = state.Socket,
                    Frame = state.Frame
                };
                ReceiveAsync(nextState);
            }
        }
コード例 #20
0
        protected override void ReceiveAsync()
        {
            try
            {
                if (client != null)
                {
                    if (parameters.guid != Guid.Empty)
                    {
                        IPEndPoint ip = (IPEndPoint)client.Client.RemoteEndPoint;

                        ReceiveState state = new ReceiveState(ip);

                        state.Set(readBuffer);

                        stream.BeginRead(state.data, state.offset, state.MissingDataLength, FinalizeReceiveLength, state);
                    }
                    else
                    {
                        throw new ArgumentNullException("remote", "The connection remote and channel are not defined.");
                    }
                }
                else
                {
                    throw new ArgumentNullException("client", "The connection tcpClient is not defined.");
                }
            }
            catch (Exception e)
            {
                HandleException(e);
            }
        }
コード例 #21
0
        public void ReadData(Server server)
        {
            if (ReadDataInner(server))
            {
                while (Data.Count >= ExpectLength)
                {
                    var bytes = PopBytes(ExpectLength);
                    switch (State)
                    {
                    case ReceiveState.Header:
                    {
                        ExpectLength = BitConverter.ToInt32(bytes, 0) - 4;
                        Frame        = BitConverter.ToInt32(bytes, 4);
                        State        = ReceiveState.Data;

                        if (ExpectLength < 0 || ExpectLength > MaxOrderLength)
                        {
                            server.DropClient(this);
                            Log.Write("server", "Dropping client {0} for excessive order length = {1}", PlayerIndex, ExpectLength);
                            return;
                        }
                    } break;

                    case ReceiveState.Data:
                    {
                        server.DispatchOrders(this, Frame, bytes);
                        MostRecentFrame = Frame;
                        ExpectLength    = 8;
                        State           = ReceiveState.Header;
                    } break;
                    }
                }
            }
        }
コード例 #22
0
            private void Initialize(AddressFamily addressFamily, int maxPacketLength)
            {
                if (m_Socket != null)
                {
                    Close();
                    m_Socket = null;
                }

                if (maxPacketLength <= 0)
                {
                    throw new GameFrameworkException("Max packet length is invalid.");
                }

                m_MaxPacketLength = maxPacketLength;

                switch (addressFamily)
                {
                case AddressFamily.InterNetwork:
                    m_NetworkType = NetworkType.IPv4;
                    break;

                case AddressFamily.InterNetworkV6:
                    m_NetworkType = NetworkType.IPv6;
                    break;

                default:
                    throw new GameFrameworkException(string.Format("Not supported address family '{0}'.", addressFamily.ToString()));
                }

                m_Socket       = new Socket(addressFamily, SocketType.Stream, ProtocolType.Tcp);
                m_ReceiveState = new ReceiveState(maxPacketLength);
            }
コード例 #23
0
            /// <summary>
            /// 初始化网络频道。
            /// </summary>
            /// <param name="networkType">网络类型。</param>
            /// <param name="maxPacketLength">数据包最大字节数。</param>
            public void Initialize(NetworkType networkType, int maxPacketLength)
            {
                if (m_Socket != null)
                {
                    Close();
                }

                if (maxPacketLength <= 0)
                {
                    throw new GameFrameworkException("Max packet length is invalid.");
                }

                m_NetworkType     = networkType;
                m_MaxPacketLength = maxPacketLength;

                AddressFamily addressFamily = AddressFamily.Unspecified;

                switch (networkType)
                {
                case NetworkType.IPv4:
                    addressFamily = AddressFamily.InterNetwork;
                    break;

                case NetworkType.IPv6:
                    addressFamily = AddressFamily.InterNetworkV6;
                    break;

                default:
                    throw new GameFrameworkException("Not supported network type.");
                }

                m_Socket       = new Socket(addressFamily, SocketType.Stream, ProtocolType.Tcp);
                m_ReceiveState = new ReceiveState(maxPacketLength);
            }
コード例 #24
0
        void OnReceive(IAsyncResult asyncResult)
        {
            ReceiveState state = (ReceiveState)asyncResult.AsyncState;

            try
            {
                int bytesReceived = state.ClientSocket.EndReceive(asyncResult);
                if (bytesReceived == 0)
                {
                    // Client closing the socket
                    state.ClientSocket.Close();
                }
                else
                {
                    if (bytesReceived < state.Count)
                    {
                        state.ClientSocket.BeginReceive(state.Buffer, state.Offset + bytesReceived, state.Count - bytesReceived, SocketFlags.None, OnReceive, state);
                    }
                    else
                    {
                        if (state.ReceivingLength)
                        {
                            int length = Formatting.BytesToSize(state.Buffer, state.Offset);
                            Console.WriteLine("Length: {0}", length);
                            state.ReceivingLength = false;
                            state.Buffer          = new byte[length];
                            state.Count           = length;
                            state.ClientSocket.BeginReceive(state.Buffer, 0, length, SocketFlags.None, OnReceive, state);
                        }
                        else
                        {
                            Debugging.PrintBytes(state.Buffer, state.Count);
                            byte[] lengthBytes = new byte[4];
                            byte[] response    = this.dispatcher.DispatchOperation(state.Buffer, state.Offset, state.Count);
                            Formatting.SizeToBytes(response.Length, lengthBytes, 0);
                            state.ClientSocket.Send(lengthBytes);
                            state.ClientSocket.Send(response);

                            ReceiveState receiveState = new ReceiveState
                            {
                                ClientSocket    = state.ClientSocket,
                                Buffer          = new byte[4],
                                Offset          = 0,
                                Count           = 4,
                                ReceivingLength = true,
                            };
                            state.ClientSocket.BeginReceive(receiveState.Buffer, 0, 4, SocketFlags.None, OnReceive, receiveState);
                        }
                    }
                }
            }
            catch (ObjectDisposedException)
            {
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
        }
コード例 #25
0
        public void ReceivePackage(Socket handler, Action <Socket, PackageArgs> callback)
        {
            ReceiveState state = new ReceiveState(handler, callback);

            Register.WriteLog("Start receiving Packages...");
            handler.BeginReceive(state.Buffer, 0, SendState.FIRST_PACKAGE_SIZE, 0,
                                 new AsyncCallback(ReceiveCallBack), state);
        }
コード例 #26
0
        /// <summary>
        /// Обработать очередной кусок принятых данных
        /// </summary>
        /// <param name="buffer"></param>
        public void ProcessPart(byte[] buffer)
        {
            int i = 0;

            while (i < buffer.Length)
            {
                if (_state == ReceiveState.RECEIVING_HEADER)
                {
                    //Ждем заголовка

                    if (buffer[i] == _packageHeder[_currentHeaderByte])
                    {
                        //Читаем заголовок
                        _state = ReceiveState.RECEIVING_HEADER;
                        _currentHeaderByte++;
                        //Console.WriteLine("Read header");
                    }
                    else
                    {
                        //Это не заголовок
                        _currentHeaderByte = 0;
                        _state             = ReceiveState.RECEIVING_HEADER;
                        //Console.WriteLine("Not header");
                    }

                    if (_currentHeaderByte == _packageHeder.Length)
                    {
                        //Заголовок полностью считан
                        _state = ReceiveState.RECEVING_BODY;
                        //Console.WriteLine("Header received");
                    }
                }
                else if (_state == ReceiveState.RECEVING_BODY)
                {
                    //Читаем пакет
                    _receivedQueue.Add(buffer[i]);
                    //Console.WriteLine("Receive package");

                    if (_receivedQueue.Count == _packageLength)
                    {
                        //Пакет полностью считан
                        _state             = ReceiveState.RECEIVING_HEADER;
                        _currentHeaderByte = 0;

                        //Console.WriteLine("Package received");

                        if (PackageReceived != null)
                        {
                            PackageReceived(this, _receivedQueue.ToArray());
                        }

                        _receivedQueue.Clear();
                    }
                }

                i++;
            }
        }
コード例 #27
0
 public SerialPacket()
 {
     receive_state = ReceiveState.AwaitingStartByte;
     receive_next_char_is_escaped = false;
     receive_address  = 0;
     receive_checksum = 0;
     receive_length   = 0;
     receive_data     = new List <byte>();
 }
コード例 #28
0
            public TcpEdge GetEdge(Socket s)
            {
                ReceiveState rs = (ReceiveState)_sock_to_rs[s];

                if (rs != null)
                {
                    return(rs.Edge);
                }
                return(null);
            }
コード例 #29
0
            public void AddEdge(TcpEdge e)
            {
                Socket s = e.Socket;

                AllSockets.Add(s);
                ReceiveState rs = new ReceiveState(e, BA);

                _sock_to_rs[s] = rs;
                Interlocked.Increment(ref TEL._count);
            }
コード例 #30
0
 private void BeginReceive(ReceiveState state)
 {
     this.BaseSocket.BeginReceive(
         state.Buffer.Buffer,
         state.Buffer.Offset + state.ReceivedBytes,
         state.Buffer.Length - state.ReceivedBytes,
         SocketFlags.None,
         this.BeginReceiveCallback,
         state);
 }
コード例 #31
0
ファイル: WebSocket.cs プロジェクト: RonaldV/hyperion
        /// <summary>
        /// Receive data asynchronous
        /// </summary>
        public void ReceiveAsync()
        {
            var state = new ReceiveState
            {
                //Socket = socket,
                Frame = new Frame()
            };

            ReceiveAsync(state);
        }
コード例 #32
0
ファイル: WebSocket.cs プロジェクト: RonaldV/hyperion
 private void ReceiveAsync(ReceiveState state)
 {
     //var socket = state.Socket;
     if (socket == null || !socket.Connected)
     {
         Disconnected.Raise(this);
         return;
     }
     stream.BeginRead(state.Buffer, 0, state.Buffer.Length, OnReceiveAsync, state);
 }
コード例 #33
0
        void receiveLength(ReceiveState state)
        {
            int offset = state == null ? 0 : 1;

            state = state == null ? new ReceiveState() : state;

            _stream.BeginRead(state.len,
                              offset,
                              2 - offset,
                              _receiveCallback,
                              state);            
        }
コード例 #34
0
 public SerialPacket()
 {
     receive_state = ReceiveState.AwaitingStartByte;
     receive_next_char_is_escaped = false;
     receive_address = 0;
     receive_checksum = 0;
     receive_length = 0;
     receive_data = new List<byte>();
 }
コード例 #35
0
            /// <summary>
            /// Feed a byte to the serial depacketizing state machine
            /// </summary>
            /// <param name="data"></param>
            /// <returns>non-null byte [] when a packet is received completely</returns>
            public byte[] ProcessByte(byte data)
            {
                // Check for invalid data conditions, ignore any bad bytes
                if (data == null_BYTE || data == MAX_BYTE)
                {
                    Console.WriteLine("Serial Error: Got bad byte from serial stream");
                    return null;
                }

                if (receive_state == ReceiveState.AwaitingStartByte && data != START_BYTE)
                {
                    Console.WriteLine("Serial Error: Got an unexpected byte while waiting for start byte");
                    return null;
                }

                if (receive_state != ReceiveState.AwaitingStartByte && data == START_BYTE)
                {
                    Console.WriteLine("Serial Error: start byte found while already processing a packet");
                    return null;
                }

                // Check if the next byte is escaped
                if (data == ESCAPE_CHAR)
                {
                    receive_next_char_is_escaped = true;
                    return null;
                }
                if (receive_next_char_is_escaped)
                {
                    if (data == ESCAPE_CHAR_ESCAPED) {
                        data =  ESCAPE_CHAR;
                    } else if (data == START_BYTE_ESCAPED) {
                               data =  START_BYTE;
                    } else if (data == null_BYTE_ESCAPED) {
                               data =  null_BYTE;
                    } else if (data == MAX_BYTE_ESCAPED) {
                               data =  MAX_BYTE;
                    }
                    receive_next_char_is_escaped = false;
                }

                switch (receive_state)
                {
                    case ReceiveState.AwaitingStartByte:
                        receive_next_char_is_escaped = false;
                        receive_state = ReceiveState.AwaitingAddress;
                        break;

                    case ReceiveState.AwaitingAddress:
                        receive_address = data;
                        receive_checksum = data;
                        receive_state = ReceiveState.AwaitingLength;
                        break;

                    case ReceiveState.AwaitingLength:
                        receive_length = data;
                        receive_checksum += data;
                        receive_data.Clear();
                        receive_state = ReceiveState.AwaitingData;
                        break;

                    case ReceiveState.AwaitingData:
                        receive_checksum += data;
                        receive_data.Add(data);
                        if (--receive_length == 0)
                        {
                            receive_state = ReceiveState.AwaitingChecksum;
                        }
                        break;

                    case ReceiveState.AwaitingChecksum:
                        receive_state = ReceiveState.AwaitingStartByte;
                        receive_checksum = (byte)~receive_checksum;
                        if (data != receive_checksum)
                        {
                            Console.WriteLine("Serial Error: Checksum Mismatch");
                            return null;
                        }
                        return receive_data.ToArray();
                }
                return null;
            }
コード例 #36
0
ファイル: Camera.cs プロジェクト: beaglebot/BeagleBot
 void PrepareToReceiveImageHeader(SocketAsyncEventArgs args)
 {
     args.SetBuffer(headerBuffer, 0, headerBuffer.Length);
     numHeaderBytesReceived = 0;
     receiveState = ReceiveState.WaitingForImageHeader;
     ReceiveNextPacketAsync(args);
 }
コード例 #37
0
ファイル: Camera.cs プロジェクト: beaglebot/BeagleBot
        void ProcessImageHeader(SocketAsyncEventArgs args)
        {
            // Have we received an entire image header yet?
            numHeaderBytesReceived += args.BytesTransferred;
            if (numHeaderBytesReceived < ImageHeaderSize)
            {
                // No, so wait till we get some more data.
                args.SetBuffer(numHeaderBytesReceived, ImageHeaderSize - numHeaderBytesReceived);
                ReceiveNextPacketAsync(args);
                return;
            }

            // Marshal it into a struct.
            GCHandle pinnedBuffer = GCHandle.Alloc(args.Buffer, GCHandleType.Pinned);
            imageHeader = (ImageHeader)Marshal.PtrToStructure(pinnedBuffer.AddrOfPinnedObject(), typeof(ImageHeader));
            pinnedBuffer.Free();

            // Check it looks sensible.
            if (imageHeader.MagicNumber != ImageHeaderMagicNumber ||
                imageHeader.Height <= 0 && imageHeader.Height > 10000 ||
                imageHeader.Width <= 0 || imageHeader.Width > 10000 ||
                imageHeader.Size <= 0 || imageHeader.Size > 10000000)
            {
                Debug.WriteLine("ERROR: bad image header");
                ReceiveNextPacketAsync(args);
                return;
            }

            // Looks like we've got a new image to download. Setup to receive the image data.
            numImagesAttemptedToReceive++;
            imageBuffer = new byte[imageHeader.Size];
            numImagesBytesReceived = 0;
            receiveState = ReceiveState.WaitingForDataBlock;
            args.SetBuffer(imageBuffer, 0, imageBuffer.Length);
            ReceiveNextPacketAsync(args);
        }
コード例 #38
0
ファイル: Controller.cs プロジェクト: awakegod/NETMF-LPC
 internal MessageReassembler( Controller parent )
 {
     m_parent = parent;
     m_state  = ReceiveState.Initialize;
 }
コード例 #39
0
 void receive(ReceiveState state)
 {
     _stream.BeginRead(state.data,
                       state.offset,
                       state.length - state.offset,
                       _receiveCallback,
                       state);            
 }
コード例 #40
0
ファイル: StreamEngine.cs プロジェクト: bbqchickenrobot/netmq
        public StreamEngine(AsyncSocket handle, Options options, string endpoint)
        {
            m_handle = handle;
            m_insize = 0;
            m_ioEnabled = false;
            m_sendingState = SendState.Idle;
            m_receivingState = ReceiveState.Idle;
            m_outsize = 0;
            m_session = null;
            m_options = options;
            m_plugged = false;
            m_endpoint = endpoint;
            m_socket = null;
            m_encoder = null;
            m_decoder = null;
            m_actionsQueue = new Queue<StateMachineAction>();

            //  Set the socket buffer limits for the underlying socket.
            if (m_options.SendBuffer != 0)
            {
                m_handle.SendBufferSize = m_options.SendBuffer;
            }
            if (m_options.ReceiveBuffer != 0)
            {
                m_handle.ReceiveBufferSize = m_options.ReceiveBuffer;
            }
        }
コード例 #41
0
ファイル: StreamEngine.cs プロジェクト: bbqchickenrobot/netmq
        private void ProcessInput()
        {
            bool disconnection = false;
            int processed;

            if (m_insize == -1)
            {
                m_insize = 0;
                disconnection = true;
            }

            if (m_options.RawSocket)
            {
                if (m_insize == 0 || !m_decoder.MessageReadySize(m_insize))
                {
                    processed = 0;
                }
                else
                {
                    processed = m_decoder.ProcessBuffer(m_inpos, m_insize);
                }
            }
            else
            {
                //  Push the data to the decoder.
                processed = m_decoder.ProcessBuffer(m_inpos, m_insize);
            }

            if (processed == -1)
            {
                disconnection = true;
            }
            else
            {
                //  Stop polling for input if we got stuck.
                if (processed < m_insize)
                {
                    m_receivingState = ReceiveState.Stuck;

                    m_inpos.AdvanceOffset(processed);
                    m_insize -= processed;
                }
                else
                {
                    m_inpos = null;
                    m_insize = 0;
                }
            }

            //  Flush all messages the decoder may have produced.
            m_session.Flush();

            //  An input error has occurred. If the last decoded message
            //  has already been accepted, we terminate the engine immediately.
            //  Otherwise, we stop waiting for socket events and postpone
            //  the termination until after the message is accepted.
            if (disconnection)
            {
                if (m_decoder.Stalled())
                {
                    m_ioObject.RemoveSocket(m_handle);
                    m_ioEnabled = false;
                    m_state = State.Stalled;
                }
                else
                {
                    Error();
                }
            }
            else if (m_receivingState != ReceiveState.Stuck)
            {
                m_decoder.GetBuffer(out m_inpos, out m_insize);
                BeginRead(m_inpos, m_insize);
            }
        }
コード例 #42
0
ファイル: StreamEngine.cs プロジェクト: bbqchickenrobot/netmq
        private void Activate()
        {
            //  Handshaking was successful.
            //  Switch into the normal message flow.
            m_state = State.Active;

            m_outsize = 0;

            m_sendingState = SendState.Active;
            BeginSending();

            m_receivingState = ReceiveState.Active;

            if (m_insize == 0)
            {
                m_decoder.GetBuffer(out m_inpos, out m_insize);
                BeginRead(m_inpos, m_insize);
            }
            else
            {
                ProcessInput();
            }
        }
コード例 #43
0
ファイル: StreamEngine.cs プロジェクト: bbqchickenrobot/netmq
        private void Handle(Action action, SocketError socketError, int bytesTransferred)
        {
            switch (m_state)
            {
                case State.Closed:
                    switch (action)
                    {
                        case Action.Start:
                            if (m_options.RawSocket)
                            {
                                m_encoder = new RawEncoder(Config.OutBatchSize, m_session, m_options.Endian);
                                m_decoder = new RawDecoder(Config.InBatchSize, m_options.MaxMessageSize, m_session, m_options.Endian);

                                Activate();
                            }
                            else
                            {
                                m_state = State.Handshaking;
                                m_handshakeState = HandshakeState.Closed;
                                HandleHandshake(action, socketError, bytesTransferred);
                            }

                            break;
                    }
                    break;
                case State.Handshaking:
                    HandleHandshake(action, socketError, bytesTransferred);
                    break;
                case State.Active:
                    switch (action)
                    {
                        case Action.InCompleted:
                            m_insize = EndRead(socketError, bytesTransferred);

                            ProcessInput();
                            break;
                        case Action.ActivateIn:

                            // if we stuck let's continue, other than that nothing to do
                            if (m_receivingState == ReceiveState.Stuck)
                            {
                                m_receivingState = ReceiveState.Active;
                                ProcessInput();
                            }
                            break;
                        case Action.OutCompleted:
                            int bytesSent = EndWrite(socketError, bytesTransferred);

                            //  IO error has occurred. We stop waiting for output events.
                            //  The engine is not terminated until we detect input error;
                            //  this is necessary to prevent losing incoming messages.
                            if (bytesSent == -1)
                            {
                                m_sendingState = SendState.Error;
                            }
                            else
                            {
                                m_outpos.AdvanceOffset(bytesSent);
                                m_outsize -= bytesSent;

                                BeginSending();
                            }
                            break;
                        case Action.ActivateOut:
                            // if we idle we start sending, other than do nothing
                            if (m_sendingState == SendState.Idle)
                            {
                                m_sendingState = SendState.Active;
                                BeginSending();
                            }
                            break;
                        default:
                            Debug.Assert(false);
                            break;
                    }
                    break;
                case State.Stalled:
                    switch (action)
                    {
                        case Action.ActivateIn:
                            //  There was an input error but the engine could not
                            //  be terminated (due to the stalled decoder).
                            //  Flush the pending message and terminate the engine now.
                            m_decoder.ProcessBuffer(m_inpos, 0);
                            Debug.Assert(!m_decoder.Stalled());
                            m_session.Flush();
                            Error();
                            break;
                        case Action.ActivateOut:
                            break;
                    }
                    break;
            }
        }
コード例 #44
0
ファイル: Controller.cs プロジェクト: awakegod/NETMF-LPC
            /// <summary>
            /// Essential Rx method. Drives state machine by reading data and processing it. This works in
            /// conjunction with NotificationThreadWorker [Tx].
            /// </summary>
            internal void Process()
            {
                int count;
                int bytesRead;

                try
                {
                    switch(m_state)
                    {
                        case ReceiveState.Initialize:
                            m_rawPos        = 0;

                            m_base          = new MessageBase();
                            m_base.m_header = new Packet();

                            m_raw           = new MessageRaw ();
                            m_raw .m_header = m_parent.CreateConverter().Serialize( m_base.m_header );

                            m_state = ReceiveState.WaitingForHeader;
                            goto case ReceiveState.WaitingForHeader;

                        case ReceiveState.WaitingForHeader:
                            count = m_raw.m_header.Length - m_rawPos;

                            bytesRead = m_parent.Read(m_raw.m_header, m_rawPos, count);
                            m_rawPos += bytesRead;

                            while(m_rawPos > 0)
                            {
                                int flag_Debugger = ValidSignature( m_parent.marker_Debugger );
                                int flag_Packet   = ValidSignature( m_parent.marker_Packet   );
                                
                                if(flag_Debugger == 1 || flag_Packet == 1)
                                {
                                    m_state = ReceiveState.ReadingHeader;
                                    goto case ReceiveState.ReadingHeader;
                                }

                                if(flag_Debugger == 0 || flag_Packet == 0)
                                {
                                    break; // Partial match.
                                }

                                m_parent.App.SpuriousCharacters( m_raw.m_header, 0, 1 );

                                Array.Copy( m_raw.m_header, 1, m_raw.m_header, 0, --m_rawPos );
                            }
                            break;

                        case ReceiveState.ReadingHeader:
                            count = m_raw.m_header.Length - m_rawPos;

                            bytesRead = m_parent.Read(m_raw.m_header, m_rawPos, count);

                            m_rawPos += bytesRead;

                            if (bytesRead != count) break;

                            m_state = ReceiveState.CompleteHeader;
                            goto case ReceiveState.CompleteHeader;

                        case ReceiveState.CompleteHeader:
                            try
                            {
                                m_parent.CreateConverter().Deserialize( m_base.m_header, m_raw.m_header );

                                if(VerifyHeader() == true)
                                {
                                    bool fReply = (m_base.m_header.m_flags & Flags.c_Reply) != 0;

                                    m_base.DumpHeader( "Receiving" );

                                    if(m_base.m_header.m_size != 0)
                                    {
                                        m_raw.m_payload = new byte[m_base.m_header.m_size];
                                        //reuse m_rawPos for position in header to read.
                                        m_rawPos = 0;

                                        m_state = ReceiveState.ReadingPayload;
                                        goto case ReceiveState.ReadingPayload;
                                    }
                                    else
                                    {
                                        m_state = ReceiveState.CompletePayload;
                                        goto case ReceiveState.CompletePayload;
                                    }
                                }
                            }
                            catch(ThreadAbortException)
                            {
                                throw;
                            }
                            catch(Exception e)
                            {
                                Console.WriteLine( "Fault at payload deserialization:\n\n{0}", e.ToString() );
                            }

                            m_state = ReceiveState.Initialize;

                            if((m_base.m_header.m_flags & Flags.c_NonCritical) == 0)
                            {
                                IncomingMessage.ReplyBadPacket( m_parent, Flags.c_BadHeader );
                            }

                            break;

                        case ReceiveState.ReadingPayload:
                            count = m_raw.m_payload.Length - m_rawPos;

                            bytesRead = m_parent.Read(m_raw.m_payload, m_rawPos, count);

                            m_rawPos += bytesRead;

                            if (bytesRead != count) break;

                            m_state = ReceiveState.CompletePayload;
                            goto case ReceiveState.CompletePayload;

                        case ReceiveState.CompletePayload:
                            if(VerifyPayload() == true)
                            {
                                try
                                {
                                    bool fReply = (m_base.m_header.m_flags & Flags.c_Reply) != 0;

                                    if((m_base.m_header.m_flags & Flags.c_NACK) != 0)
                                    {
                                        m_raw.m_payload = null;
                                    }

                                    m_parent.App.ProcessMessage( this.GetCompleteMessage(), fReply );

                                    m_state = ReceiveState.Initialize;
                                    return;
                                }
                                catch(ThreadAbortException)
                                {
                                    throw;
                                }
                                catch(Exception e)
                                {
                                    Console.WriteLine( "Fault at payload deserialization:\n\n{0}", e.ToString() );
                                }
                            }

                            m_state = ReceiveState.Initialize;

                            if((m_base.m_header.m_flags & Flags.c_NonCritical) == 0)
                            {
                                IncomingMessage.ReplyBadPacket( m_parent, Flags.c_BadPayload );
                            }

                            break;             
                    }
                }
                catch
                {
                    m_state = ReceiveState.Initialize;
                    throw;
                }
            }
コード例 #45
0
        public void byteReceived(byte newByte)
        {
            switch(curState)
            {
                case ReceiveState.FIND_FIRST_HEADER_CHAR:
                    if(newByte == '#')
                    {
                        curState = ReceiveState.FIND_SECOND_HEADER_CHAR;
                    }
                    else if(newByte == 'P')
                    {
                        psocReadyAckStringIterator.next();
                        curState = ReceiveState.RECEIVING_PSOC_READY_ACK;
                    }
                    else
                    {
                        throw new ArgumentException("invalid state");
                    }
                    break;

                case ReceiveState.RECEIVING_PSOC_READY_ACK:
                    if(newByte == psocReadyAckStringIterator.next())
                    {
                        if(psocReadyAckStringIterator.finished())
                        {
                            psocReadyAckStringIterator.reset();
                            curState = ReceiveState.FIND_FIRST_HEADER_CHAR;
                            if(PsocReadyEvent != null) PsocReadyEvent(this, new PsocReadyEventArgs());
                        }
                    }
                    else
                    {
                        throw new Exception("invalid state");
                    }
                    break;

                case ReceiveState.FIND_SECOND_HEADER_CHAR:
                    if(newByte == 'F')
                    {
                        curState = ReceiveState.READING_NUM_SAMPLES;
                        numExpectedSamples = 0;
                    }
                    else
                    {
                        throw new ArgumentException("invalid state");
                    }
                    break;

                case ReceiveState.READING_NUM_SAMPLES:
                    if(newByte == 'D')
                    {
                        if(numExpectedSamples == 0)
                        {
                            throw new ArgumentException("can't have a frame size of zero");
                        }
                        numBytesReceived = 0;
                        numExpectedBytes = numExpectedSamples * 2;
                        sampleFrameAssembler.SetNumSamplesExpected(numExpectedSamples);
                        curState = ReceiveState.RECEIVING_SAMPLES;
                    }
                    else if(newByte >= '0' && newByte <= '9')
                    {
                        numExpectedSamples *= 10;
                        numExpectedSamples += (uint)(newByte - '0');
                    }
                    else
                    {
                        throw new ArgumentException("invalid state");
                    }
                    break;

                case ReceiveState.RECEIVING_SAMPLES:
                    sampleAssembler.AddReceivedByte(newByte);
                    if(++numBytesReceived == numExpectedBytes)
                    {
                        curState = ReceiveState.FIND_FIRST_HEADER_CHAR;
                    }
                    break;
            }
        }