Пример #1
0
 private void InitializeMessageProcessing()
 {
     lock (syn_msg)
     {
         ReInitializeMessageProcessing();
         message_state = EMessageProcessingState.MESSAGE_HEADER;
     }
 }
Пример #2
0
        /// <summary>
        /// Asyn read result process
        /// </summary>
        /// <param name="ar"></param>
        private void OnDataRead(IAsyncResult ar)
        {
            EMessageProcessingState state = (EMessageProcessingState)ar.AsyncState;

            // Here we get a new buffer from the socket
            try
            {
                buffer_bytes_available += ns.EndRead(ar);
                if (buffer_bytes_available == 0)
                {
                    Debug.WriteLine("Someone closed the socket on us");
                    return;
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }

            lock (syn_msg)
            {
                while (buffer_bytes_available > 0)
                {
                    //Debug.WriteLine("Bytes Available " + buffer_bytes_available.ToString());
                    Int32 bytesToCopy;

                    switch (message_state)
                    {
                    case EMessageProcessingState.MESSAGE_UNKNOWN:
                        Debug.WriteLine("Unexpected message state");
                        break;

                    case EMessageProcessingState.MESSAGE_HEADER:
                        // In this state we are waiting for enough header bytes to arrive
                        // we should never have enough bytes when we enter this
                        Debug.Assert(msg_cursor < LLRP_HEADER_SIZE);
                        // copy as many as we can into the header storage
                        bytesToCopy = (Int32)Math.Min(LLRP_HEADER_SIZE - msg_cursor, buffer_bytes_available);
                        //Debug.WriteLine("Header Copy " + bytesToCopy.ToString());
                        Array.Copy(buffer, buffer_cursor, msg_header_storage, msg_cursor, bytesToCopy);
                        msg_cursor             += (UInt32)bytesToCopy;
                        buffer_cursor          += bytesToCopy;
                        buffer_bytes_available -= bytesToCopy;

                        Debug.Assert(msg_cursor <= LLRP_HEADER_SIZE);

                        if (msg_cursor == LLRP_HEADER_SIZE)
                        {
                            importAndQualifyHeader();
                            msg_data = new byte[msg_len];
                            Array.Copy(msg_header_storage, msg_data, LLRP_HEADER_SIZE);

                            if (msg_cursor == msg_len)
                            {
                                // The message body is empty.
                                TriggerMessageEvent(msg_ver, msg_type, msg_id, msg_data);

                                ReInitializeMessageProcessing();
                                message_state = EMessageProcessingState.MESSAGE_HEADER;
                            }
                            else
                            {
                                // There is more data needed.
                                message_state = EMessageProcessingState.MESSAGE_BODY;
                            }
                        }
                        break;

                    case EMessageProcessingState.MESSAGE_BODY:
                        // In this state, we are waiting for the body to arrive

                        // copy as many as we can into the header storage
                        bytesToCopy = (Int32)Math.Min(msg_len - msg_cursor, buffer_bytes_available);
                        //Debug.WriteLine("Message Copy " + bytesToCopy.ToString());
                        Array.Copy(buffer, buffer_cursor, msg_data, msg_cursor, bytesToCopy);
                        msg_cursor             += (UInt32)bytesToCopy;
                        buffer_cursor          += bytesToCopy;
                        buffer_bytes_available -= bytesToCopy;

                        Debug.Assert(msg_cursor <= msg_len);

                        if (msg_cursor == msg_len)
                        {
                            TriggerMessageEvent(msg_ver, msg_type, msg_id, msg_data);
                            ReInitializeMessageProcessing();
                            message_state = EMessageProcessingState.MESSAGE_HEADER;
                        }
                        break;
                    }
                }
            }

            try
            {
                // we are out of bytes, receive the next message
                StartNewBufferReceive();
            }
            catch
            {
                // do nothing here
            }
        }