private void InitializeMessageProcessing() { lock (syn_msg) { ReInitializeMessageProcessing(); message_state = EMessageProcessingState.MESSAGE_HEADER; } }
/// <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 } }